基于opencv可以实现打开摄像头检测追踪多个小球的系统c++代码
时间: 2023-12-06 17:03:36 浏览: 115
以下是基于OpenCV实现打开摄像头检测追踪多个小球的C++代码示例:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
VideoCapture cap(0); //打开默认摄像头
if (!cap.isOpened()) //检查是否成功打开摄像头
{
cout << "摄像头打开失败!" << endl;
return -1;
}
namedWindow("Ball Tracking", WINDOW_AUTOSIZE); //创建窗口用于显示追踪结果
while (true)
{
Mat frame, hsv, mask;
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
Scalar lower_red(0, 100, 100); //设置红色的HSV值范围
Scalar upper_red(10, 255, 255);
cap >> frame; //读取视频帧
if (frame.empty()) //确保读取到的帧不为空
break;
cvtColor(frame, hsv, COLOR_BGR2HSV); //将帧转换为HSV颜色空间
inRange(hsv, lower_red, upper_red, mask); //应用颜色掩模以获取红色区域
findContours(mask, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE); //查找轮廓
vector<vector<Point>> contours_poly(contours.size()); //用于存储多边形逼近后的轮廓
vector<Rect> boundRect(contours.size()); //用于存储轮廓的矩形边界框
for (size_t i = 0; i < contours.size(); i++) //对每个轮廓进行处理
{
approxPolyDP(contours[i], contours_poly[i], 3, true); //多边形逼近
boundRect[i] = boundingRect(contours_poly[i]); //获取矩形边界框
}
for (size_t i = 0; i < contours.size(); i++) //绘制矩形边界框
{
rectangle(frame, boundRect[i].tl(), boundRect[i].br(), Scalar(0, 255, 0), 2);
}
imshow("Ball Tracking", frame); //显示追踪结果
if (waitKey(30) == 27) //按ESC键退出
break;
}
destroyAllWindows(); //销毁所有窗口
return 0;
}
```
以上代码使用了OpenCV的VideoCapture类打开摄像头并读取每一帧视频,然后将每一帧转换为HSV颜色空间,应用颜色掩模以获取红色区域,查找轮廓并用多边形逼近来获取轮廓的矩形边界框,最后绘制矩形边界框并显示追踪结果。可以根据需求修改代码以适应不同的场景和需求。
阅读全文