1

使用 OpenCV 和 cvBlobsLib 制作通常的 blob 跟踪器,我遇到了这个问题,似乎没有其他人遇到过,这让我很难过。我得到了 RGB/BGR 框架,选择要隔离的颜色,将其设置为黑白,找到斑点并在每个斑点上添加边界矩形,但是当我显示最终图像时,框在 x 轴上拉伸:当对象在左侧时,盒子靠近它(虽然大约大 2.5 倍),并且当它向右移动时,盒子移动得更快(= 离对象越来越远)直到它到达右端对象还不到一半时的窗口。这不会发生在 y 轴上,一切都很好。这不是矩形的问题,当我使用 fillBlob 时也会发生这种情况,blob 形状会拉伸且未对齐。还有,它' 与图像捕获无关,因为我尝试过使用 kinect (OpenNI)、网络摄像头甚至使用单个图像 (imread()),并且我验证了使用的每个 ImageGenerator、Mat、IplImage 都是 640x480、8 位深度,为此,我对 namedWindow 使用了 AUTOSIZE (放大到全屏窗口也无济于事)。显示 BGR 帧和阈值图像没有问题,它们都适合窗口,但是当我将检测到的斑点与原始图像合并时,它们似乎属于不同的分辨率空间。这是代码,与网上随处可见的常见示例没有太大变化:为此,我对 namedWindow 使用了 AUTOSIZE (放大到全屏窗口也无济于事)。显示 BGR 帧和阈值图像没有问题,它们都适合窗口,但是当我将检测到的斑点与原始图像合并时,它们似乎属于不同的分辨率空间。这是代码,与网上随处可见的常见示例没有太大变化:为此,我对 namedWindow 使用了 AUTOSIZE (放大到全屏窗口也无济于事)。显示 BGR 帧和阈值图像没有问题,它们都适合窗口,但是当我将检测到的斑点与原始图像合并时,它们似乎属于不同的分辨率空间。这是代码,与网上随处可见的常见示例没有太大变化:

//[...]
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 转换之间,但我真的不知道如何找到它。

4

1 回答 1

0

哦,天哪,我花了很长时间来写整个问题,第二天我几乎随便找到了答案。当我为阈值创建 B/W 矩阵时,我没有将其设为单通道;我复制了 BGR 矩阵类型,因此有一个具有 3 个通道的阈值图像,这导致 widthStep 是帧宽度的 3 倍。解决了以 CV_8UC1 作为类型创建 cv::Mat imgTresh。

于 2012-10-22T16:44:28.880 回答