【问题标题】:OpenCV color extraction in iOSiOS中的OpenCV颜色提取
【发布时间】:2014-09-26 05:05:56
【问题描述】:

我有一个CvVideoCamera,我正在尝试检测每个帧中的蓝色,并且输出帧应该只包含蓝色对象,例如here。我在委托方法中这样做:

- (void)processImage:(cv::Mat&)image
{
    cv::Mat bgrMat;
    cvtColor(image, bgrMat, CV_BGRA2BGR);

    // Covert color space to HSV
    cv::Mat hsvMat;
    cvtColor(bgrMat, hsvMat, CV_BGR2HSV);

    // Threshold the HSV image
    cv::Mat blueMask;

    cv::Scalar lower_blue(110, 50, 50);
    cv::Scalar upper_blue(130, 255, 255);

    cv::inRange(hsvMat, lower_blue, upper_blue, blueMask);
    bitwise_and(bgrMat, bgrMat, image, blueMask);
}

原图:

结果:

蓝色检测似乎工作正常,但最终结果是红色而不是蓝色。任何想法为什么?我是否正确使用了bitwise_and

[编辑]

这些行可以解决问题:

    cv::Mat output;
    image.copyTo(output, blueMask);
    output.copyTo(image);

代替:

    bitwise_and(bgrMat, bgrMat, image, blueMask);

感谢karlphillip 的建议。出于某种原因,bgrMat 在此过程中被“改变”了,所以我改用原来的image

【问题讨论】:

    标签: ios image opencv image-processing extract


    【解决方案1】:

    我认为您要完成的是使用蓝色蒙版从输入图像中复制像素,对吗?最后将代码调整为:

    cv::inRange(hsvMat, lower_blue, upper_blue, blueMask);
    
    cv::Mat output;
    bgrMat.copyTo(output, blueMask);
    

    【讨论】:

    • 已经尝试过了,同样的结果:红色而不是蓝色。但感谢您的快速回答。 (注意:输出是'image'参数)
    • 在屏幕上显示blueMask,看看是否有意义。您可能已经在 cv::Scalar 上切换了一些值(请记住,它们仍然是 BGR 顺序,不是 RGB)。
    • blueMask 在蓝色区域为白色,在其他区域为黑色。对于蓝色范围标量,我使用 this 教程中的值。
    猜你喜欢
    • 2020-01-22
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 2014-09-15
    • 2013-09-22
    • 2014-02-23
    • 2012-09-11
    • 2014-04-20
    相关资源
    最近更新 更多