繁体   English   中英

OpenCV-HSV奇数范围检测

[英]OpenCV - odd HSV range detection

我有一个Qt应用,必须在点击坐标周围找到几个像素的HSV范围,以便以后跟踪。 这是我的方法:

    cv::Mat temp;
    cv::cvtColor(frame, temp, CV_BGR2HSV); //frame is pulled from a video or jpeg
    cv::Vec3b hsv=temp.at<cv::Vec3b>(frameX,frameY); //sometimes SIGSEGV?
    qDebug() << hsv.val[0]; //look up H
    qDebug() << hsv.val[1]; //look up S
    qDebug() << hsv.val[2]; //look up V
    //just base values so far, will work on range later
    emit hsvDownloaded(hsv.val[0], hsv.val[0]+5, hsv.val[1], 255, hsv.val[2], 255); //send to GUI which automaticly updates worker thread

现在,事情很奇怪。 这些是结果(红色圆圈表示单击位置): 单击蓝色单击红色-正确

对于红色,这很奇怪,尽管形状是相同颜色的固体,但形状的上半部分可以正确检测,而下半部分则不能正确检测。 绿色完全拧紧

并进行实际测试 在此处输入图片说明

它检测到HSV {95,196,248} ,这很荒谬(基本值太高)。 被检测到的像素甚至都不是被单击的像素。 在100%的时间内检测到该球的最佳值为H:35-141 S:0-238 V:65-255 我想从归一化的直方图中得到一个HSV范围,但我什至无法正确获得基本值。 这是怎么回事? 当OpenCV使用kalibrowanyPlik.read(frame);kalibrowanyPlik.read(frame); ,默认的配色方案是BGR,对吗?

为什么颜色检测会如此随机地工作?

正如berak所提到的,您的代码看起来像您使用索引以错误的顺序访问像素。

这意味着您的像素位置是错误的,除了对角线上的像素之外,因此将正确检测对角线周围的单击对象,而其他所有像素都不会。

为了避免一遍又一遍的困惑,我想让您理解为什么OpenCV使用(row,col)索引排序:

OpenCV使用矩阵表示图像。 在数学中,二维矩阵使用(行,列)索引,请查看http://en.wikipedia.org/wiki/Index_notation#Two-dimensional_arrays并查看索引。 因此,对于矩阵,通常首先使用行索引,然后再使用列索引。

不幸的是,图像和像素通常具有(x,y)索引,该索引对应于数学图形和坐标系中的x / y轴/方向。 因此,这里首先使用x位置,然后使用y位置。

幸运的是,OpenCV提供了两种不同的.at方法版本,一种用于访问像素位置,一种用于访问矩阵元素(最后是完全相同的元素)。

matrix.at<type>(row,column) // matrix indexing to access elements
// which equals
matrix.at<type>(y,x)

matrix.at<type>(cv::Point(x,y)) // pixel/position indexing to access elements

由于第一个版本的效率更高,如果位置尚未作为cv :: Point对象给出,则应该首选该版本。 因此,最好的方法通常是记住,openCV使用矩阵表示图像,并使用矩阵索引符号访问元素。

顺便说一句,我见过很多人想知道为什么matrix.at<type>(cv::Point(y,x))不能按预期的方式工作,因为他们了解到openCV图像使用了“错误的顺序”。 我希望我的解释之后不会出现这个问题。

顺便说一句:在学校我已经想知道为什么矩阵首先索引行,而函数图首先索引x轴。 我发现不为两者使用“相同”的命令是很愚蠢的,但是我仍然不得不忍受它:D(最后,两者之间没有太多关系)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM