基于opencv打开摄像头检测追踪多个不同颜色的小球系统c++代码
时间: 2023-09-30 11:09:42 浏览: 116
好的,我可以提供一个基于 OpenCV 的 C++ 代码示例,该示例可以检测并跟踪多个不同颜色的小球。以下是代码:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
// 打开摄像头
VideoCapture cap(0);
if (!cap.isOpened()) {
cerr << "Error opening camera" << endl;
return -1;
}
// 定义颜色范围(HSV空间)
vector<Scalar> colors;
colors.push_back(Scalar(0, 70, 70)); // 红色
colors.push_back(Scalar(20, 100, 100)); // 橙色
colors.push_back(Scalar(30, 255, 255)); // 黄色
colors.push_back(Scalar(50, 150, 150)); // 绿色
// 用于存储每个颜色的二值图像
vector<Mat> masks(colors.size());
while (true) {
// 读取帧
Mat frame;
cap.read(frame);
// 转换到HSV空间
Mat hsv;
cvtColor(frame, hsv, COLOR_BGR2HSV);
// 检测每个颜色
for (int i = 0; i < colors.size(); i++) {
// 创建掩膜
inRange(hsv, colors[i], colors[i], masks[i]);
// 对掩膜进行形态学操作以去除噪声
Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(5, 5));
morphologyEx(masks[i], masks[i], MORPH_OPEN, kernel);
// 查找轮廓
vector<vector<Point>> contours;
findContours(masks[i], contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 绘制轮廓和中心点
for (int j = 0; j < contours.size(); j++) {
drawContours(frame, contours, j, Scalar(0, 255, 0), 2);
Moments m = moments(contours[j]);
Point center(m.m10 / m.m00, m.m01 / m.m00);
circle(frame, center, 5, Scalar(0, 0, 255), -1);
}
}
// 显示帧
imshow("Frame", frame);
// 按下ESC键退出
if (waitKey(1) == 27) {
break;
}
}
return 0;
}
```
该代码使用颜色范围来检测每个颜色的小球,然后对每个颜色的二值图像进行形态学操作以去除噪声,并使用 findContours 函数查找轮廓。最后,绘制轮廓和中心点,并在窗口中显示帧。
希望对你有所帮助!
阅读全文