基于opencv进行摄像头精准识别检测追踪小球并标出位置系统c++代码
时间: 2023-12-16 15:02:26 浏览: 112
以下是基于 OpenCV 的摄像头精准识别检测追踪小球并标出位置的 C++ 代码示例:
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// 打开摄像头
VideoCapture cap(0);
// 检查是否成功打开摄像头
if (!cap.isOpened())
{
std::cout << "无法打开摄像头!" << std::endl;
return -1;
}
// 创建窗口
namedWindow("摄像头", CV_WINDOW_AUTOSIZE);
// 创建一个颜色范围的过滤器,用于检测小球
Scalar lowerBound = Scalar(29, 86, 6);
Scalar upperBound = Scalar(64, 255, 255);
Mat frame, hsv, mask;
// 无限循环,直到用户按下 Esc 键退出程序
while (true)
{
// 获取当前帧
cap.read(frame);
// 将当前帧转换为 HSV 颜色空间
cvtColor(frame, hsv, COLOR_BGR2HSV);
// 应用颜色范围过滤器来检测小球
inRange(hsv, lowerBound, upperBound, mask);
// 对二值图像进行形态学操作,以消除噪声
erode(mask, mask, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
dilate(mask, mask, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)));
// 查找小球的轮廓
std::vector<std::vector<Point>> contours;
std::vector<Vec4i> hierarchy;
findContours(mask, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);
// 如果找到了轮廓,则说明检测到了小球
if (contours.size() > 0)
{
// 在图像中画出小球的最小外接圆
std::vector<Point2f> center;
std::vector<float> radius;
minEnclosingCircle(contours[0], center, radius);
circle(frame, center[0], radius[0], Scalar(0, 0, 255), 2);
}
// 显示处理后的图像
imshow("摄像头", frame);
// 检查用户是否按下 Esc 键
if (waitKey(30) == 27)
{
break;
}
}
// 释放摄像头和窗口资源
cap.release();
destroyAllWindows();
return 0;
}
```
该代码使用了颜色范围过滤器,将图像中的小球检测出来,并使用最小外接圆将其包围。你可以根据自己的需求,调整颜色范围过滤器的参数,以适应不同的环境和小球颜色。
阅读全文