2015-05-27 35 views
0

我有一个Qt的应用程序,我必须找到一对夫妇周围点击坐标像素的HSV范围,跟踪以后。我这样做:的OpenCV - 奇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 

现在,事情很奇怪。这些都是结果(红色圆圈表示的点击位置): clicking blue clicked red - correct

以红这很奇怪,正确检测形状的上半部分,下半部分是不,尽管它是同色的固体物质。 green completly screws up

和用于实际测试 enter image description here

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

为什么会产生颜色检测工作,以便随机?

+1

'cv :: Vec3b hsv = temp.at (frameX,frameY); //有时候是SIGSEGV?' - 欢迎来到行,列世界!你必须使用'at (y,x);' – berak

+1

或cv :: Vec3b hsv = temp.at (cv :: Point(frameX,frameY)); – Micka

+0

@Micka cv :: Point(x,y)它是。哈,这样一个简单的错误。谢谢。继续并按照berak的建议写出答案 – Petersaber

回答

2

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

这意味着你的像素位置是错误的,但对于处在对角线上的像素,所以点击是围绕对角线将被正确检测的对象,而所有其他的不会。

要不要再感到困惑,并再次,我希望你能理解为什么OpenCV的用途(行,列)订购了指数:

的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(并在最后,两者与另一个没有太大关系)

+1

深入。谢谢 – Petersaber