opencv颜色识别代码

需要编写一个opencv的程序,能够不断采集摄像头的图像,计算图像中红色(或接近红色)区域的大小,如占整个图像一定比例以上,则输出1,否则输出0... 需要编写一个opencv的程序,能够不断采集摄像头的图像,计算图像中红色(或接近红色)区域的大小,如占整个图像一定比例以上,则输出1,否则输出0 展开
 我来答
qiu__peng
推荐于2016-03-12 · TA获得超过293个赞
知道小有建树答主
回答量:95
采纳率:0%
帮助的人:119万
展开全部
#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;
 }
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式