OpenCV+cvBlobsLib:blob 在 x 轴上"stretched"出来

OpenCV+cvBlobsLib: blobs come out "stretched" on the x-axis

本文关键字:stretched 出来 轴上 blob OpenCV+cvBlobsLib      更新时间:2023-10-16

使用OpenCV和cvblobslib制作通常的blob跟踪器,我遇到了这个问题,似乎没人有它,这让我很难过。我获得了RGB/BGR框架,选择隔离颜色,将其转换为b/w,找到斑点并在每个斑点上添加边界矩形,但是当我显示最终图像时,盒子在x轴上拉伸,:当对象位于左侧时,盒子靠近它(尽管大约2.5倍),并且随着其向右移动时,盒子移动的速度更快(=越来越远离对象),直到到达到达的右端对象甚至没有一半的窗口。这不会在Y轴上发生,一切都很好。这不是矩形的问题,当我使用fillblob aswell时,它会发生斑点形状伸展和错位。另外,这不是与图像捕获相关的问题,因为我尝试使用Kinect(OpenNi),网络摄像头,甚至使用单个图像(Imread(Imread()),我验证了每个图像生机器,垫子,使用的iPlimage均为640x480,8bit深度,我将其用于命名的Window(放大到全屏幕窗口也无济于事)。显示BGR框架和TreShold图像没有任何问题,它们都适合窗口,但是当我将它们与原始图像合并时,检测到的斑点似乎属于不同的分辨率空间。这是代码,与在线在线发现的通常示例相比,没有太大变化:

//[...]
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);

" [...]"是与此问题无关的代码,但是如果您需要有关我如何处理图像的更多信息,请告诉我。P>

基于我捕获图像的方式不会改变任何东西,BGR帧和B/W图像的显示很好,并且在获得斑点后,显示出任何显示它们的方式给出了相同的(错误)结果,问题必须是cblobresult()和matrix2ipl转换之间的问题,但我真的不知道如何找到它。

哦,天哪,我花了很长时间来写整个问题,第二天我几乎随意地找到答案。当我创建用于treshold的b/w矩阵时,我没有使其单渠道。我复制了BGR矩阵类型,因此具有3个通道的Treshold图像,导致框架宽度的宽度3倍。解决CV_8UC1作为类型创建CV :: MAT IMGTRESH。