Выбор контуров с помощью мыши?

Мой проект берет растровый снимок клиентской области данного окна и преобразует эти данные в IplImage пример. Затем после преобразования в градациях серого, обмолота и т. Д. Ограничивающие рамки рисуются вокруг любых контуров, которые превышают заданный минимальный размер (объем площади).
Результат затем отображается в cvNamedWindow

Все, что мне нужно сделать сейчас, — это позволить пользователю щелкнуть в этих строках, чтобы эффективно «выбрать» этот контур, чтобы приложение могло затем извлечь подчиненное как новый образ и сохранить его на диск.

Как это может быть достигнуто с помощью OpenCV в C ++?

0

Решение

Если вы храните свои ограничивающие блоки, вы можете включить цикл for в обработчике события мыши, если выбран блок и какой блок выбран. Код для создания события мыши:

cvNamedWindow("MyWindow", CV_WINDOW_NORMAL);
cvSetMouseCallback("MyWindow", mouseEvent, 0);
imshow("MyWindow", image);

void mouseEvent(int evt, int x, int y, int flags, void *param) {
if (evt == CV_EVENT_LBUTTONDOWN) {
printf("%d %d\n", x, y);
}
}

Возможно, вы сами узнаете, как проверить, находятся ли эти координаты внутри ограничительной рамки. Я также рекомендовал бы использовать C ++ API, как указано в комментариях, так как это намного проще, когда вы освоите его.

2

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

В случае, если кто-то еще был заинтересован в том, как на самом деле извлечь выбранное изображение,
вот как я смог это сделать:

inline
IplImage* getSubImage(IplImage *image, CvRect region)
{
cvSetImageROI(image, region);
IplImage *imgRet = cvCreateImage( cvSize(region.width, region.height), image->depth, image->nChannels );
cvCopy(image, imgRet);
cvResetImageROI(image);
return imgRet;
}

inline
bool pointInRect(const int x, const int y, const CvRect& r)
{
return (
(x > r.x) && (x < (r.x + r.width)) &&
(y > r.y) && (y < (r.y + r.height))
);
}

void onMouseEvent(int evt, int x, int y, int flags, void *param)
{
if (evt == CV_EVENT_LBUTTONDOWN) {
// boundingBoxes is declared as a vector of CvRects and
//    filled in the main loop using cvBoundingRect(contour)
for(UINT i = 0; i < boundingBoxes.size(); i++)
{
CvRect rect = boundingBoxes[i].rect;
if( pointInRect(x, y, rect) )
{
IplImage* img = getSubImage(imgSource, rect);
// Do whatever you want with the sub-image here
cvNamedWindow("Selection");
cvShowImage("Selection", img);
cvReleaseImage(&img);
break;
}
}
}
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector