gpt4 book ai didi

opencv - 使用 OpenCV 和 C++ 检测 RGB 颜色区间

转载 作者:太空宇宙 更新时间:2023-11-03 20:55:43 27 4
gpt4 key购买 nike

我想使用 OpenCV 和 C++ 检测视频或图像中的红色物体。有哪些算法可用于执行此操作?

我想比较一下颜色层次之间的关系。实际上,当亮度发生变化时,该比率保持不变。所以我想为感兴趣区域的颜色确定可接受值的区间。

对于案例,我查看红色的 R (x, y) 和 G (x, y)/R (x, y) 和 B (x, y)/R (x, y)。

然后我会找到可接受值的范围 :为了获得第一个想法,它从调色板图像中释放每个报告的最大值和最小值红色

我想找到这样的东西:

if minR<=R(x,y)<=maxR and minG<=G(x,y)<=maxG minB<=B(x,y)<=maxB so couleur(x,y)=blanc else couleur(x,y)=NOIR

最佳答案

使用 cv::inRange() 预处理图像具有必要的颜色边界以隔离红色。您可能希望转换为 HSV 或 YCbCr 等颜色空间以获得更稳定的颜色边界,因为色度和亮度更好地分离了。您可以使用 cvtColor()为了这。查看我的回答here一个使用 inRange()createTrackbar() 的好例子。

因此,基本模板将是:

Mat redColorOnly;
inRange(src, Scalar(lowBlue, lowGreen, lowRed), Scalar(highBlue, highGreen, highRed), redColorOnly);
detectSquares(redColorOnly);

编辑:只需使用轨迹栏来确定您要隔离的颜色范围,然后使用您发现有效的颜色间隔。您不必经常使用轨迹栏。

示例:
因此,对于此处模板的完整示例,

我在 GIMP 中创建了一个简单(理想)的图像,如下所示: enter image description here

然后我创建了这个程序来过滤除红色方 block 之外的所有方 block :

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

using namespace std;
using namespace cv;

Mat redFilter(const Mat& src)
{
assert(src.type() == CV_8UC3);

Mat redOnly;
inRange(src, Scalar(0, 0, 0), Scalar(0, 0, 255), redOnly);

return redOnly;
}

int main(int argc, char** argv)
{
Mat input = imread("colored_squares.png");

imshow("input", input);
waitKey();

Mat redOnly = redFilter(input);

imshow("redOnly", redOnly);
waitKey();

// detect squares after filtering...

return 0;
}

注意:您将无法对真实图像使用这些完全相同的过滤间隔;我只是建议您使用轨迹栏调整间隔,看看什么是可以接受的。

输出看起来像这样:

enter image description here

瞧!只剩下红色方 block :)

享受 :)

关于opencv - 使用 OpenCV 和 C++ 检测 RGB 颜色区间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9018906/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com