opencv识别红绿蓝三色之一并记录占比最大的颜色的代码,c++
时间: 2024-04-08 14:31:20 浏览: 29
以下是一个使用OpenCV进行红绿蓝三色之一识别并记录占比最大颜色的简单C++代码示例:
```c++
#include <opencv2/opencv.hpp>
int main()
{
// 打开摄像头
cv::VideoCapture cap(0);
if (!cap.isOpened())
{
std::cout << "无法打开摄像头" << std::endl;
return -1;
}
// 创建窗口
cv::namedWindow("Color Detection", cv::WINDOW_NORMAL);
while (true)
{
cv::Mat frame;
cap >> frame;
// 将图像从BGR颜色空间转换为HSV颜色空间
cv::Mat hsvFrame;
cv::cvtColor(frame, hsvFrame, cv::COLOR_BGR2HSV);
// 定义红、绿、蓝颜色范围
cv::Scalar lowerRed(0, 100, 100);
cv::Scalar upperRed(10, 255, 255);
cv::Scalar lowerGreen(50, 100, 100);
cv::Scalar upperGreen(70, 255, 255);
cv::Scalar lowerBlue(110, 100, 100);
cv::Scalar upperBlue(130, 255, 255);
// 创建颜色掩码
cv::Mat maskRed, maskGreen, maskBlue;
cv::inRange(hsvFrame, lowerRed, upperRed, maskRed);
cv::inRange(hsvFrame, lowerGreen, upperGreen, maskGreen);
cv::inRange(hsvFrame, lowerBlue, upperBlue, maskBlue);
// 对掩码进行形态学操作
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5, 5));
cv::morphologyEx(maskRed, maskRed, cv::MORPH_OPEN, kernel);
cv::morphologyEx(maskGreen, maskGreen, cv::MORPH_OPEN, kernel);
cv::morphologyEx(maskBlue, maskBlue, cv::MORPH_OPEN, kernel);
// 计算每个颜色的像素数量
double redPixels = cv::countNonZero(maskRed);
double greenPixels = cv::countNonZero(maskGreen);
double bluePixels = cv::countNonZero(maskBlue);
// 找到占比最大的颜色
std::string maxColor;
if (redPixels > greenPixels && redPixels > bluePixels)
maxColor = "红色";
else if (greenPixels > redPixels && greenPixels > bluePixels)
maxColor = "绿色";
else if (bluePixels > redPixels && bluePixels > greenPixels)
maxColor = "蓝色";
else
maxColor = "无";
// 在图像上显示占比最大的颜色
std::string text = "占比最大的颜色:" + maxColor;
cv::putText(frame, text, cv::Point(10, 30), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 255, 0), 2);
// 显示图像
cv::imshow("Color Detection", frame);
// 按下Esc键退出循环
if (cv::waitKey(1) == 27)
break;
}
// 释放摄像头和窗口
cap.release();
cv::destroyAllWindows();
return 0;
}
```
在这个示例中,我们使用摄像头捕获图像,并将图像从BGR颜色空间转换为HSV颜色空间。然后,我们定义了红、绿、蓝三种颜色的范围,并创建了相应的颜色掩码。接下来,我们对每个颜色的掩码进行形态学操作,并计算每个颜色的像素数量。最后,我们找到占比最大的颜色,并在图像上显示结果。
请注意,这只是一个简单的示例,您可能需要根据具体需求进行修改和优化。还可以根据您的需要调整颜色范围和形态学操作的参数。
希望对您有所帮助!如果您有任何其他问题,请随时提问。