opencv—常用函数学习_“干货“_13

目录

三四、机器学习

支持向量机(SVM)

K近邻算法(KNearest)

随机森林(RTrees)

朴素贝叶斯分类器(NormalBayesClassifier)

自适应增强算法(Boost)

多层感知器人工神经网络(ANN_MLP)

解释

三五、相机标定

棋盘格角点检测 (findChessboardCorners)

精确化角点位置 (cornerSubPix)

摄像机标定 (calibrateCamera)

图像畸变校正 (undistort)

单应性矩阵计算 (findHomography)

[PnP 问题求解 (solvePnP)](#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中的摄像机标定函数来进行角点检测、图像畸变校正、姿态估计等任务。根据具体的应用需求,可以灵活运用这些函数来实现复杂的摄像机标定和图像处理任务。

相关推荐
johnsong1 小时前
AI前沿日报 · 2026-10-31 | 安全失守——当AI工具被下毒、当云端门户洞开
人工智能·安全
水云桐程序员1 小时前
从零开发软件的步骤,软件开发从零到完成应该怎么做?
笔记·学习·软件构建·个人开发
David猪大卫1 小时前
【Linux修炼】环境变量、进程地址空间
linux·c语言·经验分享·笔记·学习·ubuntu·centos
得帆低代码PaaS2 小时前
企业级 Agent 架构:MCP、Integration、数据与治理能力
大数据·人工智能·架构·ai agent·企业数字化·mcp
叼烟扛炮3 小时前
Linux 学习笔记(五十六):IO 多路复用初探——select 的“三宗罪”
linux·服务器·数据库·笔记·学习·php
一条大祥脚3 小时前
TVM 的前世今生:从深度学习编译器到 AI 基础设施
人工智能·深度学习·tvm
冬奇Lab4 小时前
一天一个开源项目(第255篇):Mika —— 装在安卓手机里的 AI 代理,在后台虚拟屏上替你操作 App 和网页
人工智能·开源·资讯
孟健6 小时前
实测 agent-desktop:AI 控制桌面不截图、不占鼠标键盘,连点 55 次计算器 0 失误
人工智能·架构·开源
MUSHANGXS6 小时前
大模型时代的新蓝海-基于OS底层的AI-Agent应用
人工智能·职场和发展·交互
伞伞悦读6 小时前
【第76期】两张3行表左连接变5行:主键、validate与未匹配排查完整教程
人工智能·python