OpenCV + cvBlobsLib: капли выходят «растянутыми» по оси х

Делая обычный трекер блобов с помощью OpenCV и cvBlobsLib, я столкнулся с этой проблемой, и, похоже, больше ни у кого ее не было, что меня огорчает. Я получаю кадр RGB / BGR, выбираю цвет для выделения, порождаю его в ч / б, нахожу капли и добавляю ограничивающий прямоугольник на каждый блоб, но когда я отображаю окончательное изображение, прямоугольник растягивается по оси X : когда объект находится слева, поле находится рядом с ним (хотя примерно в 2,5 раза больше), и по мере его перемещения вправо поле перемещается быстрее (= все дальше и дальше от объекта), пока не достигнет правого конца окно, когда объект даже не на полпути. Этого не происходит на оси Y, где все в порядке. Это не проблема с прямоугольниками, это случается, когда я использую fillBlob, а форма шарика получается растянутой и смещенной. Кроме того, это не проблема, связанная с захватом изображений, поскольку я пробовал использовать kinect (OpenNI), веб-камеру и даже использовать одно изображение (imread ()), и я проверил, что все используемые ImageGenerator, Mat, IplImage были 640×480, 8bit глубина, для которой я использовал AUTOSIZE для namedWindow (увеличение до полноэкранного окна тоже не помогает). Отображение рамки BGR и изображения с трешолдингом не вызывает проблем, они оба помещаются в окно, но обнаруженные BLOB-объекты, по-видимому, принадлежат к другому пространству разрешения, когда я объединяю их с исходным изображением. Вот код, который не сильно изменился по сравнению с обычными примерами, которые можно найти везде:

//[...]
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, но я не знаю, как это выяснить.

1

Решение

О боже, я потратил целую вечность, чтобы написать всю проблему, и на следующий день я нашел ответ почти случайно. Поскольку я создал черно-белую матрицу для трешолдинга, я не сделал ее одноканальной; Я скопировал матричный тип BGR, получив таким образом пороговое изображение с 3 каналами, что привело к ширине шага, в 3 раза превышающей ширину кадра. Решено создавать cv :: Mat imgTresh с типом CV_8UC1.

0

Другие решения

Других решений пока нет …