【问题标题】:OpenCV C++ Color Detection and Print MacOpenCV C++ 颜色检测和打印 Mac
【发布时间】:2014-12-14 14:50:18
【问题描述】:

我是 OpenCV 的新手,正在做一个视频分析项目。基本上,我想将我的网络摄像头分成两侧(左侧和右侧),并且已经想出了如何做到这一点。但是,我还想分析每一面的红色和绿色,并打印出红色/绿色的像素数量。我必须通过所有可能的博客来解决这个问题,但可惜它仍然不起作用。以下代码运行,但不是检测红色,因为代码可能暗示它似乎拾取白色(所有光源和白色墙壁)。我花了几个小时梳理代码,但仍然找不到解决方案。请帮忙!另请注意,这是通过 Xcode 在 OSX 10.8 上运行的。谢谢!

#include <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/core/core.hpp"

using namespace cv;
using namespace std;

int main( int argc, char** argv )
{
    VideoCapture cap(0); //capture the video from webcam

    if ( !cap.isOpened() )  // if not success, exit program
    {
        cout << "Cannot open the web cam" << endl;
        return -1;
    }

    namedWindow("HSVLeftRed", CV_WINDOW_AUTOSIZE);
    namedWindow("HSVLeftGreen", CV_WINDOW_AUTOSIZE);


    while (true) {

        Mat image;
        cap.read(image);
        Mat HSV;
        Mat threshold;

        //Left Cropping
        Mat leftimg = image(Rect(0, 0, 640, 720));       

        //Left Red Detection
        cvtColor(leftimg,HSV,CV_BGR2HSV);
        inRange(HSV,Scalar(0,0,150),Scalar(0,0,255),threshold);
        imshow("HSVLeftRed",threshold);

        //Left Green Detection
        cvtColor(leftimg,HSV,CV_BGR2HSV);
        inRange(HSV,Scalar(still need to find proper min values),Scalar(still need to find proper max values),threshold);
        imshow("HSVLeftGreen",threshold);
    }
    return 0;
}

【问题讨论】:

    标签: c++ xcode macos opencv video-processing


    【解决方案1】:

    您正在裁剪 640x720 的区域,这可能不完全适合您的内容。提示:使用capture.get(CAP_PROP_FRAME_WIDTH)capture.get(CAP_PROP_FRAME_HEIGHT) 检查您的实际捕获分辨率。您可能需要考虑Mat threshold --> Mat thresholded。这只是一些咆哮:)

    我怀疑实际问题是您用于 HSV 的阈值。根据cvtolor,关于 RGB 到 HSV 转换的部分,

    在输出 0

    所以您应该使用代表您的 V 阈值的浮点数,即 150 -&gt; 150/255 ~= 0.58 等。

    【讨论】:

    • 非常感谢您的帮助。所以标量值是 HSV(不是 RGB)?我从一些示例代码中发现了这一点。另外,对于宽松的红/绿范围,您有什么建议?我改变了一些东西,外部干扰明显减少了,但它仍然无法识别我的红色桨。
    • 是的,当您使用 inRange() 时,它使用 HSV 中的阈值,这是您作为输入引用的内容。由于您要查找的是纯色,因此阈值可以通过简单的阈值在 RGB 颜色空间中发生,例如对于一个大的 G 分量同时一个低的 R 和 B 分量。我建议在阈值之前对亮度/亮度进行归一化,以获得更多的结果,或者在归一化的 rgb 色彩空间(r = R / (R+G+B) 等)中工作。
    猜你喜欢
    • 2016-10-17
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2018-04-22
    • 1970-01-01
    • 2021-08-20
    相关资源
    最近更新 更多