基于opencv可以实现打开摄像头检测追踪多个小球,并用圆形边界框起来的系统c++代码
时间: 2024-01-06 08:04:26 浏览: 81
C++ 打开摄像头(Opencv)
以下是基于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<Point2f> center(contours.size()); //用于存储每个轮廓的中心点
vector<float> radius(contours.size()); //用于存储每个轮廓的半径
for (size_t i = 0; i < contours.size(); i++) //对每个轮廓进行处理
{
approxPolyDP(contours[i], contours_poly[i], 3, true); //多边形逼近
minEnclosingCircle(contours_poly[i], center[i], radius[i]); //获取最小外接圆
}
for (size_t i = 0; i < contours.size(); i++) //绘制圆形边界框
{
circle(frame, center[i], (int)radius[i], Scalar(0, 255, 0), 2);
}
imshow("Ball Tracking", frame); //显示追踪结果
if (waitKey(30) == 27) //按ESC键退出
break;
}
destroyAllWindows(); //销毁所有窗口
return 0;
}
```
以上代码在原有的基础上新增了对最小外接圆的计算,并用圆形边界框代替了矩形边界框。可以根据需求修改代码以适应不同的场景和需求。
阅读全文