成功搞定了基于VS2022和opencv的色块识别代码
目前可以实现识别绿色色块并框起来和显示中心点。
代码:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
// 自定义比较函数,用于排序轮廓
bool compareContourArea(vector<Point> contour1, vector<Point> contour2) {
double area1 = contourArea(contour1);
double area2 = contourArea(contour2);
return (area1 > area2);
}
int main() {
// 打开摄像头
VideoCapture cap(0);
if (!cap.isOpened()) {
cout << "Error: Failed to open camera." << endl;
return -1;
}
while (true) {
Mat frame;
cap >> frame; // 从摄像头中获取一帧图像
// 检查是否成功获取了图像
if (frame.empty()) {
cout << "Error: Failed to capture frame." << endl;
break;
}
// 将图像转换为灰度图
Mat gray;
cvtColor(frame, gray, COLOR_BGR2GRAY);
// 对灰度图进行阈值处理,分割出绿色色块
Mat green_binary;
inRange(frame, Scalar(0, 100, 0), Scalar(100, 255, 100), green_binary); // 绿色色块的阈值范围
// 寻找绿色色块的轮廓
vector<vector<Point>> green_contours;
findContours(green_binary, green_contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 对轮廓按面积进行排序
sort(green_contours.begin(), green_contours.end(), compareContourArea);
// 仅保留最大的两个绿色色块
vector<Point> largest_green_contour;
if (green_contours.size() >= 1) {
largest_green_contour = green_contours[0];
}
// 计算最大绿色色块的中心和坐标
Moments green_moments = moments(largest_green_contour);
Point green_center(green_moments.m10 / green_moments.m00, green_moments.m01 / green_moments.m00);
// 在图像上绘制最大绿色色块的中心和坐标
circle(frame, green_center, 5, Scalar(0, 255, 0), -1);
// 获取最大绿色色块的边界框
Rect green_bbox = boundingRect(largest_green_contour);
// 在图像上框出最大绿色色块的轮廓
rectangle(frame, green_bbox, Scalar(0, 255, 0), 2);
// 显示处理后的图像
imshow("Frame", frame);
// 检查是否按下了ESC键,如果按下则退出循环
if (waitKey(30) == 27) {
break;
}
}
// 关闭摄像头
cap.release();
destroyAllWindows();
return 0;
}