【发布时间】:2015-05-27 13:03:42
【问题描述】:
我有一个 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); 拉帧时,默认配色方案是 BGR,对吧?
为什么颜色检测会如此随机?
【问题讨论】:
-
cv::Vec3b hsv=temp.at<cv::Vec3b>(frameX,frameY); //sometimes SIGSEGV?- 欢迎来到世界上校!你必须使用at<type>(y,x); -
或 cv::Vec3b hsv=temp.at<:vec3b>(cv::Point (frameX,frameY));
-
@Micka cv::Point(x,y) 它是。哈,这么简单的错误。谢谢你。继续写答案
-
按照 berak 的建议,cv::Vec3b hsv=temp.at<:vec3b>(frameY,frameX);也可以工作,效率更高一些。您可能会发现首先索引行令人困惑,因为图形和图像通常首先索引 x 轴。但是在数学中,矩阵首先索引行,而opencv使用矩阵来表示图像。