我想用OpenCV和C++检测视频或图像中的红色对象.有什么算法可以做到这一点?
我想比较一下颜色的关系.实际上,当亮度变化时,比率保持不变.所以我想确定感兴趣区域颜色的可接受值的间隔.
对于情况,我看红R(x,y)和G(x,y)/ R(x,y)和B(x,y)/ R(x,y).
然后,我将找到可接受值的范围:为了获得第一个想法,它从调色板图像红色中释放每个报告的最大值和最小值
我想找到这样的东西:
如果minR <= R(x,y)<= maxR且minG <= G(x,y)<= maxG minB <= B(x,y)<= maxB so couleur(x,y)= blanc else couleur( X,Y)= NOIR
mev*_*ron 27
使用cv :: inRange()对图像进行预处理,并使用必要的颜色边界来隔离红色.您可能希望转换为HSV或YCbCr等色彩空间,以获得更稳定的色彩边界,因为色度和亮度可以更好地分离.你可以使用cvtColor().看看我的答案在这里使用的一个很好的例子inRange()有createTrackbar().
所以,基本模板将是:
Mat redColorOnly;
inRange(src, Scalar(lowBlue, lowGreen, lowRed), Scalar(highBlue, highGreen, highRed), redColorOnly);
detectSquares(redColorOnly);
Run Code Online (Sandbox Code Playgroud)
编辑:只需使用轨迹栏确定要隔离的颜色范围,然后使用找到的颜色间隔.您不必经常使用轨道栏.
示例:
那么,有关模板的完整示例,请转到
我在GIMP中创建了一个简单(和理想)的图像,如下所示:

然后我创建了这个程序来过滤除红色方块以外的所有方块:
#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;
}
Run Code Online (Sandbox Code Playgroud)
注意:您将无法对实际图像使用这些完全相同的滤镜间隔; 我建议您使用轨迹栏调整间隔以查看可接受的内容.
输出如下所示:

瞧!只有红场仍然是:)
请享用 :)
| 归档时间: |
|
| 查看次数: |
46127 次 |
| 最近记录: |