目录
三四、机器学习
支持向量机(SVM)
K近邻算法(KNearest)
随机森林(RTrees)
朴素贝叶斯分类器(NormalBayesClassifier)
自适应增强算法(Boost)
多层感知器人工神经网络(ANN_MLP)
解释
三五、相机标定
棋盘格角点检测 (findChessboardCorners)
精确化角点位置 (cornerSubPix)
摄像机标定 (calibrateCamera)
图像畸变校正 (undistort)
单应性矩阵计算 (findHomography)
PnP 问题求解 (solvePnP)
http://t.csdnimg.cn/i8pqt —— opencv—常用函数学习_“干货“_总(VIP)
散的正在一部分一部分发,不需要VIP。
资料整理不易,有用话给个赞和收藏吧。
三四、机器学习
在OpenCV中,机器学习模块(ML module)提供了多种分类器和回归器,用于各种机器学习任务。下面介绍一些常用的机器学习算法及其使用示例。
常用机器学习算法 | |||
SVM(Support Vector Machine) | KNearest | RTrees(Random Trees) | NormalBayesClassifier |
支持向量机 | K近邻算法 | 随机森林 | 朴素贝叶斯分类器 |
Boost(AdaBoost) | ANN_MLP(Artificial Neural Network - Multi-Layer Perceptron): | DNN(Deep Neural Network) | |
自适应增强算法 | 多层感知器人工神经网络 | 深度神经网络 |
支持向量机(SVM)
import cv2
import numpy as np# 创建训练数据
train_data = np.array([[1, 2], [2, 3], [3, 3], [6, 6], [7, 7], [8, 8]], dtype=np.float32)
labels = np.array([0, 0, 0, 1, 1, 1], dtype=np.int32)# 初始化SVM并设置参数
svm = cv2.ml.SVM_create()
svm.setKernel(cv2.ml.SVM_LINEAR)
svm.setType(cv2.ml.SVM_C_SVC)
svm.setC(1)# 训练SVM
svm.train(train_data, cv2.ml.ROW_SAMPLE, labels)# 创建测试数据
test_data = np.array([[2, 2], [5, 5]], dtype=np.float32)# 预测
_, results = svm.predict(test_data)
print("Predicted labels:", results.ravel())
K近邻算法(KNearest)
# 初始化K近邻分类器并设置参数
knn = cv2.ml.KNearest_create()
knn.setDefaultK(3)# 训练K近邻分类器
knn.train(train_data, cv2.ml.ROW_SAMPLE, labels)# 预测
ret, results, neighbours, dist = knn.findNearest(test_data, k=3)
print("Predicted labels:", results.ravel())
随机森林(RTrees)
# 初始化随机森林分类器
rtrees = cv2.ml.RTrees_create()# 训练随机森林分类器
rtrees.train(train_data, cv2.ml.ROW_SAMPLE, labels)# 预测
_, results = rtrees.predict(test_data)
print("Predicted labels:", results.ravel())
朴素贝叶斯分类器(NormalBayesClassifier)
# 初始化朴素贝叶斯分类器
bayes = cv2.ml.NormalBayesClassifier_create()# 训练朴素贝叶斯分类器
bayes.train(train_data, cv2.ml.ROW_SAMPLE, labels)# 预测
_, results = bayes.predict(test_data)
print("Predicted labels:", results.ravel())
自适应增强算法(Boost)
# 初始化Boost分类器
boost = cv2.ml.Boost_create()# 训练Boost分类器
boost.train(train_data, cv2.ml.ROW_SAMPLE, labels)# 预测
_, results = boost.predict(test_data)
print("Predicted labels:", results.ravel())
多层感知器人工神经网络(ANN_MLP)
# 初始化多层感知器人工神经网络
mlp = cv2.ml.ANN_MLP_create()
mlp.setLayerSizes(np.array([2, 5, 1])) # 输入层2个节点,隐藏层5个节点,输出层1个节点
mlp.setTrainMethod(cv2.ml.ANN_MLP_BACKPROP)# 训练多层感知器
mlp.train(train_data, cv2.ml.ROW_SAMPLE, labels)# 预测
_, results = mlp.predict(test_data)
print("Predicted labels:", results.ravel())
解释
- SVM:适用于分类和回归任务,通过最大化类别间的间隔来找到最佳分类超平面。
- KNearest:基于最近邻居的投票进行分类,简单易实现但计算量大。
- RTrees:随机森林,通过多个决策树的集成提高分类精度和防止过拟合。
- NormalBayesClassifier:基于贝叶斯定理进行分类,假设特征之间相互独立。
- Boost:通过加权的方式结合多个弱分类器形成一个强分类器,常用AdaBoost算法。
- ANN_MLP:多层感知器神经网络,通过反向传播算法进行训练,适用于复杂的非线性问题。
- DNN:深度神经网络,适用于处理大规模数据和复杂模式识别任务。
这些示例展示了如何使用OpenCV中的各种机器学习算法来进行分类和预测任务。根据具体的应用需求,可以灵活运用这些算法来实现机器学习任务。
三五、相机标定
在OpenCV中,摄像机标定是计算机视觉中的一个重要步骤,用于确定摄像机的内部参数和外部参数。摄像机标定包括一系列步骤,如角点检测、图像畸变校正、姿态估计等。下面介绍一些常用的摄像机标定函数及其使用示例。
摄像机标定函数 | |||
findChessboardCorners | findCirclesGrid | find4QuadCornerSubpix | cornerSubPix |
检测棋盘格角点 | 检测圆形网格点 | 精确化角点检测 | 进一步精确化角点位置 |
calibrateCamera | initUndistortRectifyMap | remap | undistort |
摄像机标定 | 初始化去畸变和校正映射 | 重映射图像 | 校正图像的畸变 |
findHomography | solvePnP | solvePnPRansac | Rodrigues |
计算单应性矩阵 | 解PnP问题,估计物体的姿态 | 使用RANSAC解PnP问题 | 将旋转向量转换为旋转矩阵 |
convertPointsToHomogeneous | convertPointsFromHomogeneous | ||
将点转换为齐次坐标 | 将齐次坐标转换为普通坐标 |
棋盘格角点检测 (findChessboardCorners
)
import cv2
import numpy as np# 读取棋盘格图像
image = cv2.imread('path_to_chessboard_image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 设置棋盘格大小
chessboard_size = (9, 6)# 检测棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None)# 如果找到角点,则绘制并显示
if ret:cv2.drawChessboardCorners(image, chessboard_size, corners, ret)cv2.imshow('Chessboard Corners', image)cv2.waitKey(0)cv2.destroyAllWindows()
精确化角点位置 (cornerSubPix
)
# 进一步精确化角点位置
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)# 绘制精确化后的角点
cv2.drawChessboardCorners(image, chessboard_size, corners2, ret)
cv2.imshow('Refined Corners', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
摄像机标定 (calibrateCamera
)
# 准备对象点和图像点
objp = np.zeros((chessboard_size[0] * chessboard_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2)objpoints = [] # 在世界坐标系中的三维点
imgpoints = [] # 在图像平面的二维点objpoints.append(objp)
imgpoints.append(corners2)# 摄像机标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)print("Camera matrix:\n", mtx)
print("Distortion coefficients:\n", dist)
图像畸变校正 (undistort
)
# 校正图像的畸变
dst = cv2.undistort(image, mtx, dist, None, mtx)# 显示校正后的图像
cv2.imshow('Undistorted Image', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
单应性矩阵计算 (findHomography
)
# 假设有两个点集,pts_src 和 pts_dst
pts_src = np.array([[0, 0], [0, 1], [1, 1], [1, 0]], dtype=np.float32)
pts_dst = np.array([[0, 0], [0, 1], [1, 1], [1, 0]], dtype=np.float32)# 计算单应性矩阵
H, mask = cv2.findHomography(pts_src, pts_dst, cv2.RANSAC, 5.0)print("Homography matrix:\n", H)
PnP 问题求解 (solvePnP
)
# 对象点和图像点
obj_points = np.array([[0, 0, 0], [0, 1, 0], [1, 1, 0], [1, 0, 0]], dtype=np.float32)
img_points = np.array([[100, 100], [100, 200], [200, 200], [200, 100]], dtype=np.float32)# 估计物体姿态
success, rotation_vector, translation_vector = cv2.solvePnP(obj_points, img_points, mtx, dist)print("Rotation vector:\n", rotation_vector)
print("Translation vector:\n", translation_vector)
这些示例展示了如何使用OpenCV中的摄像机标定函数来进行角点检测、图像畸变校正、姿态估计等任务。根据具体的应用需求,可以灵活运用这些函数来实现复杂的摄像机标定和图像处理任务。