写一份c++代码,识别红色圆形和蓝色矩形,用圆形框画在原始图像红色圆形,过滤掉小的蓝色矩形,得到最大蓝色矩形,用矩形框画在原始图像最大的蓝色矩形
时间: 2024-03-16 14:40:55 浏览: 120
好的,我会尽力回答您的问题。首先,请确保您已经安装了OpenCV库,因为本代码将使用OpenCV库来处理图像。
以下是C++代码,它能够识别红色圆形和蓝色矩形,并用框框标记它们:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
using namespace std;
using namespace cv;
int main()
{
//读取图像
Mat img = imread("test.jpg");
if (img.empty()) {
cout << "无法读取图像文件" << endl;
return -1;
}
//将图像从BGR色彩空间转换为HSV色彩空间
Mat hsv;
cvtColor(img, hsv, COLOR_BGR2HSV);
//定义红色和蓝色的HSV值范围
Scalar red_lower(0, 70, 50);
Scalar red_upper(10, 255, 255);
Scalar blue_lower(100, 70, 50);
Scalar blue_upper(130, 255, 255);
//在HSV图像中提取红色和蓝色的区域
Mat red_mask, blue_mask;
inRange(hsv, red_lower, red_upper, red_mask);
inRange(hsv, blue_lower, blue_upper, blue_mask);
//通过形态学操作去除噪点
Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(7, 7));
morphologyEx(red_mask, red_mask, MORPH_OPEN, kernel);
morphologyEx(blue_mask, blue_mask, MORPH_OPEN, kernel);
//在原始图像中画出红色圆形和蓝色矩形的边界框
vector<vector<Point>> red_contours, blue_contours;
findContours(red_mask, red_contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
findContours(blue_mask, blue_contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
for (size_t i = 0; i < red_contours.size(); i++) {
RotatedRect rect = minAreaRect(red_contours[i]);
Point2f vertices[4];
rect.points(vertices);
for (int j = 0; j < 4; j++) {
line(img, vertices[j], vertices[(j + 1) % 4], Scalar(0, 0, 255), 2);
}
}
int max_area = 0;
int max_index = 0;
for (size_t i = 0; i < blue_contours.size(); i++) {
double area = contourArea(blue_contours[i]);
if (area > max_area) {
max_area = area;
max_index = i;
}
}
if (max_area > 0) {
Rect rect = boundingRect(blue_contours[max_index]);
rectangle(img, rect, Scalar(255, 0, 0), 2);
}
//显示结果图像
namedWindow("Result", WINDOW_NORMAL);
imshow("Result", img);
waitKey(0);
return 0;
}
```
您可以将此代码保存为.cpp文件,并将图像文件保存在与代码文件相同的目录中,然后使用C++编译器编译和运行它。此代码将在原始图像中画出红色圆形和蓝色矩形的边界框,并且将在原始图像中画出最大的蓝色矩形的边界框。
阅读全文