Установка прямоугольной области интереса с учетом значения центрального пикселя с использованием OpenCV в C++

Я пытаюсь создать прямоугольную область интереса на изображении с расположением определенного пикселя в центре прямоугольника. Как мне это сделать?

image= imread("C:\\image.png",1);
watermark=imread("C:\\watermark.png",0);
split(image,yuv_channels);

ROI=yuv_channels[0](Rect(100,100,watermark.cols,watermark.rows)); 

Как мне изменить его так, чтобы местоположение (100 100) находилось в центре ROI?

Заранее благодарим за любую оказанную помощь.


person user1926691    schedule 26.12.2012    source источник
comment
Я думаю, вы знаете номер столбца и строки. Я могу ошибаться, но вы можете оценить точку привязки из вашего центра.   -  person emreakyilmaz    schedule 26.12.2012


Ответы (3)


Используйте следующий код для создания прямоугольника MxM с центром в точках x,y. Точки a, b можно использовать в качестве опорных точек для прямоугольника в функции rect OpenCV.

    Point a;
    Point b;
    //MxM rectangle
    a.x = x - M/2;
    a.y = y - M/2;
    b.x = x + M/2;
    b.y = y + M/2;
person Abhishek Thakur    schedule 26.12.2012

Я делал это на С# раньше, в классе Image есть функция. метод под названием 'SetROI()', я надеюсь, что это полезно для вас

person king    schedule 26.12.2012
comment
Нет, извини. Это не помогло. SetROI по-прежнему использует (100,100) в качестве опорной точки прямоугольника, т.е. верхний левый угол прямоугольника, - person user1926691; 26.12.2012

Я не уверен, понимаю ли я, но если вы просто хотите, чтобы точка (rect.x, rect.y) находилась в середине прямоугольника, просто используйте этот код:

Rect rect = Rect(100, 100, 234, 456);
rect -= Point(rect.width/2, rect.height/2)

или если вы хотите сделать это в одной строке:

Rect rect = Rect(100 - watermatk.cols/2, 100 - watermark.rows/2, watermark.cols, watermark.rows);
person cyriel    schedule 26.12.2012