opencv颜色识别代码
需要编写一个opencv的程序,能够不断采集摄像头的图像,计算图像中红色(或接近红色)区域的大小,如占整个图像一定比例以上,则输出1,否则输出0...
需要编写一个opencv的程序,能够不断采集摄像头的图像,计算图像中红色(或接近红色)区域的大小,如占整个图像一定比例以上,则输出1,否则输出0
展开
1个回答
展开全部
#include <iostream>
#include <cv.h>
#include "highgui.h"
#ifdef _DEBUG
#pragma comment(lib, "opencv_core245d.lib")
#pragma comment(lib, "opencv_highgui245d.lib")
#pragma comment(lib, "opencv_imgproc245d.lib")
#else
#pragma comment(lib, "opencv_core245.lib")
#pragma comment(lib, "opencv_highgui245.lib")
#pragma comment(lib, "opencv_imgproc245.lib")
#endif
int main()
{
cv::VideoCapture capture(0);
if (!capture.isOpened())
return 0;
cv::Mat image, HSV, channels[3];
float threshold = 0.3;
while (capture.read(image))
{
cv::cvtColor(image, HSV, CV_BGR2HSV);
cv::split(HSV, channels);
cv::threshold(channels[0], channels[1], 15, 1,CV_THRESH_BINARY_INV);
cv::threshold(channels[0], channels[0], 245, 1,CV_THRESH_BINARY);
channels[0] += channels[1];
cv::erode(channels[0], channels[0], cv::Mat::ones(3,3,CV_8UC1), cv::Point(1,1), 3);
cv::Scalar v = cv::sum(channels[0]);
int result = v[0] > channels[0].total() * threshold;
std::cout << result << std::endl;
}
}
更多追问追答
追问
运行程序直接退出
另外麻烦注释下吧
追答
int main()
{
cv::VideoCapture capture(0); // 初始化摄像头
if (!capture.isOpened())
return 0; // 摄像头打开失败,直接退出
cv::Mat image, HSV, channels[3];
float threshold = 0.3; // 定义阀值,如果整幅图片30%以上都是红色返回1
while (capture.read(image)) // 从摄像头取图
{
cv::cvtColor(image, HSV, CV_BGR2HSV); // 将RGB空间转换为HSV空间
cv::split(HSV, channels); // 把HSV三通道拆开
// 下面三句表示把H < 15 || H > 245 (红色)的地方设置为1,其他地方设置为0
cv::threshold(channels[0], channels[1], 15, 1,CV_THRESH_BINARY_INV);
cv::threshold(channels[0], channels[0], 245, 1,CV_THRESH_BINARY);
channels[0] += channels[1];
cv::erode(channels[0], channels[0], cv::Mat::ones(3,3,CV_8UC1), cv::Point(1,1), 3); // 去掉孤立的离散的点
cv::Scalar v = cv::sum(channels[0]); // 计算有多少个1,也就是红色的面积
int result = v[0] > channels[0].total() * threshold; // v[0]为红色的面积,channels[0].total()为总面积。
std::cout << result << std::endl;
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询