【问题标题】:OpenCV inRange() functionOpenCV inRange() 函数
【发布时间】:2016-10-31 02:57:08
【问题描述】:

我尝试运行以下代码:

#include<opencv\cv.h>
#include<opencv\highgui.h>

using namespace cv;


int main() {

    VideoCapture cap;
    cap.open(0);


    while (1) {

Mat src;
Mat threshold;

cap.read(src);

inRange(src, Scalar(0, 0, 0), Scalar(255, 0, 0), threshold);
imshow("thr", threshold);
imshow("hsv", src);

        waitKey(33);
    }
    return 0;
}

但它似乎没有过滤,因为我运行代码时只出现一个空白窗口。

如何让该代码检测红色?

【问题讨论】:

  • 你能正确看到你的源图像吗?还是黑窗?
  • 谢谢回复,源图我看清楚了。
  • 您忘记将 src 图像转换为 hsv ;D 此外,在 OpenCV 中使用 BGR,而不是 RGB,因此您对蓝色通道进行了阈值处理。因此,在 BGR 中,您的阈值应类似于:inRange(src, Scalar(0, 0, 0), Scalar(50, 50, 255), threshold); 更好地使用 HSV 颜色空间,请参阅副本
  • 感谢您的回复,我尝试使用您提供的点赞中的建议,但是,它也过滤并显示了许多其他原本不是红色的捕获对象,有什么方法可以使过滤更多准确的?顺便说一句,为什么我不能使用:inRange(src, Scalar(0, 0, 0), Scalar(0, 0, 255), threshold);?

标签: c++ opencv color-detection


【解决方案1】:

你必须像这样修改inRange函数:

inRange(src, Scalar(0, 0, 0), Scalar(255, 255, 255), threshold);

如果您尝试仅设置第一个通道(蓝色通道)的阈值,那么您必须让其他通道空闲,因此将其设置为 0 in lawerb 及其 dtype,通常为 255 for @ 987654327@

例如

inRange(src, Scalar(0, 50, 0), Scalar(255, 100, 255), threshold);

此行将比较第二个通道(绿色通道)并忽略其他通道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多