簡體   English   中英

OpenCV + cvBlobsLib:blob在x軸上“拉伸”出來

[英]OpenCV+cvBlobsLib: blobs come out “stretched” on the x-axis

用OpenCV和cvBlobsLib制作通常的Blob跟蹤器,我遇到了這個問題,似乎沒人遇到這個問題,這讓我很難過。 我得到RGB / BGR框架,選擇要隔離的顏色,將其放入黑白,找到斑點並在每個斑點上添加邊界矩形,但是當我顯示最終圖像時,該框在x軸上拉伸:當對象位於左側時,框靠近它(盡管大約大2.5倍),並且當它向右移動時,框移動得更快(=越來越遠離對象),直到到達右端為止當對象還沒到一半時的窗口。 在一切正常的y軸上不會發生這種情況。 矩形不是問題,當我也使用fillBlob時,就會發生斑點形狀拉伸且未對齊的情況。 而且,這與圖像捕獲無關,因為我已經嘗試使用kinect(OpenNI),網絡攝像頭甚至使用單個圖像(imread()),並且我驗證了所使用的每個ImageGenerator,Mat,IplImage均為640x480、8位深度,為此我對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幀和B / W圖像可以很好地顯示,並且在獲取斑點之后,以任何方式顯示它們都會產生相同(錯誤)的結果,因此必須解決該問題介於CBlobResult()和matrix2ipl轉換之間,但是我真的不知道如何找到它。

噢,天哪,我花了很長時間寫出整個問題,第二天,我幾乎隨便找到了答案。 當我創建黑白矩陣來進行貼現時,我並沒有使其成為單通道。 我復制了BGR矩陣類型,因此獲得了具有3個通道的閾值圖像,這導致widthStep是幀寬度的3倍。 解決了使用CV_8UC1作為類型創建cv :: Mat imgTresh的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM