在使用OpenCV和cvBlobsLib制作常见的斑点跟踪器时,我遇到了这个问题,似乎没有其他人有这个问题,这让我很难过。我得到了RGB/BGR框,选择要隔离的颜色,将其拖入b/w,找到斑点并在每个斑点上添加边界矩形,但当我显示最终图像时,框在x轴上拉伸:当对象在左侧时,框离它很近(尽管大约大2.5倍),当对象向右移动时,框移动得更快(=离对象越来越远),直到它到达窗口的右端,而对象还没有到一半。这不会发生在y轴上,因为在y轴上一切都很好。这不是矩形的问题,当我使用fillBlob时也会发生这种情况,斑点形状会拉伸并错位。而且,这不是一个与图像捕获相关的问题,因为我已经尝试过kinect (OpenNI),网络摄像头,甚至使用了单个图像(imread()),我验证了使用的每个ImageGenerator,Mat,IplImage都是640x480,8位深度,为此我在namedWindow上使用了AUTOSIZE (放大到全屏窗口也没有帮助)。显示BGR帧和tresholded图像没有问题,它们都适合窗口,但当我将它们与原始图像合并时,检测到的斑点似乎属于不同的分辨率空间。以下是代码,与网上常见的示例相比,并没有太大的变化:
//[...]
namedWindow("Color Image", CV_WINDOW_AUTOSIZE);
namedWindow("Color Tracking", CV_WINDOW_AUTOSIZE);
//[...] I already got the two cv::Mat I need, imgBGR and imgTresh
CBlobResult blobs;
CBlob *currentBlob;
Point pt1, pt2;
Rect rect;
//had to do Mat to IplImage conversion, since cvBlobsLib doesn't like mats
IplImage iplTresh = imgTresh;
IplImage iplBGR = imgBGR;
blobs = CBlobResult(&iplTresh, NULL, 0);
blobs.Filter(blobs, B_EXCLUDE, CBlobGetArea(), B_LESS, 100);
int nBlobs = blobs.GetNumBlobs();
for (int i = 0; i < nBlobs; i++)
{
currentBlob = blobs.GetBlob(i);
rect = currentBlob->GetBoundingBox();
pt1.x = rect.x;
pt1.y = rect.y;
pt2.x = rect.x + rect.width;
pt2.y = rect.y + rect.height;
cvRectangle(&iplBGR, pt1, pt2, cvScalar(255, 255, 255, 0), 3, 8, 0);
}
//[...]
imshow("Color Image", imgBGR);
imshow("Color Tracking", imgTresh);"...“是不应该与这个问题无关的代码,但如果你需要关于我如何处理图像的更多信息,请让我知道,我会发布它。
基于这样一个事实:我捕获图像的方式不会改变任何东西,BGR帧和黑白图像都能很好地显示出来,并且在获得blob之后,任何显示它们的方式都会产生相同(错误)的结果,问题一定是CBlobResult()和matrix2ipl转换之间的问题,但我真的不知道如何找出它。
发布于 2012-10-23 00:44:29
哦,天哪,我花了很长时间才写出整个问题,第二天我几乎随随便便就找到了答案。当我创建用于treshold的B/W矩阵时,我没有将其设置为单通道;我复制了BGR矩阵类型,因此具有3个通道的treshold图像,从而产生3倍于帧宽度的widthStep。已解决创建类型为CV_8UC1的cv::Mat imgTresh的问题。
https://stackoverflow.com/questions/13002466
复制相似问题