用C++的opencv写一段代码,要求能够识别红蓝色的圆环,并且使用键盘Q键,使得能够红蓝模式切换
时间: 2023-05-26 17:01:28 浏览: 110
基于opencv 的CCT(环形编码点)识别 C++版代码
5星 · 资源好评率100%
以下是一段识别红蓝色圆环的OpenCV C代码,通过按下“q”键进行模式切换:
```
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
VideoCapture cap(0);
if (!cap.isOpened()) {
cerr << "Failed to open camera!" << endl;
return -1;
}
bool is_red_mode = true;
namedWindow("Circle Detection", WINDOW_NORMAL);
while (true) {
Mat frame;
cap >> frame;
if (frame.empty()) {
cerr << "Failed to capture frame!" << endl;
break;
}
Mat hsv_frame;
cvtColor(frame, hsv_frame, COLOR_BGR2HSV);
Mat mask;
if (is_red_mode) {
inRange(hsv_frame, Scalar(0, 70, 50), Scalar(10, 255, 255), mask);
inRange(hsv_frame, Scalar(170, 70, 50), Scalar(180, 255, 255), mask);
}
else {
inRange(hsv_frame, Scalar(110, 70, 50), Scalar(130, 255, 255), mask);
}
vector<vector<Point>> contours;
findContours(mask.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
for (vector<Point> contour : contours) {
double area = contourArea(contour);
if (area > 1000) {
RotatedRect rect = minAreaRect(contour);
if (rect.size.width > 0 && rect.size.height > 0) {
double ratio = max(rect.size.width, rect.size.height) /
min(rect.size.width, rect.size.height);
if (ratio < 1.2) {
Point2f vertices[4];
rect.points(vertices);
for (int i = 0; i < 4; ++i) {
line(frame, vertices[i], vertices[(i + 1) % 4], Scalar(0, 0, 255), 2);
}
}
}
}
}
imshow("Circle Detection", frame);
char key = waitKey(1);
if (key == 'q' || key == 'Q') {
is_red_mode = !is_red_mode;
}
}
destroyAllWindows();
return 0;
}
```
其中:
- `VideoCapture` 用于从相机捕获图像。
- `cvtColor` 用于将 BGR 颜色空间转换为 HSV 颜色空间。
- `inRange` 用于给定颜色阈值范围内的像素创建掩膜,仅保留匹配颜色的像素。
- `findContours` 用于在二进制掩模上查找轮廓(即连续的点组成的曲线)。
- `contourArea` 用于计算轮廓中的区域。
- `minAreaRect` 用于计算轮廓的最小面积外接矩形。
- `line` 用于在图像上绘制线条。
- `imshow` 用于显示图像。
- `waitKey` 用于等待用户按下键盘,以便进行模式切换。
阅读全文