Понимание региона интереса к openCV 2.4

Я знаю, что в OpenCV 2.1 у нас была функция для определения ROI: cvSetImageROI(), но такая функция не существует в версии 2.4 (или, по крайней мере, я не могу найти ее в ее руководствах и разделе справки.)

однако вот только полезный код, который я мог бы найти, который использует opencv 2.4 для MAI ROI, но мне трудно понять его:

// define image ROI
cv::Mat imageROI;
imageROI= image(cv::Rect(385,270,logo.cols,logo.rows));
// add logo to image 
cv::addWeighted(imageROI,1.0,logo,0.3,0.,imageROI);

Здесь они хотят добавить очень маленький журнал в большое изображение в нижней правой части исходного изображения.

Итак, я понимаю, что для сохранения ROI создается другая матрица. Его размеры, заданные с помощью функции rect, и размер задаются равными размерам небольшого логотипа, который они хотят добавить.

Тогда thsi меня смущает: cv::addWeighted(imageROI,1.0,logo,0.3,0.,imageROI); здесь источник 1 addWeighted - это набор размеров ROI, источником 2 является логотип, а пункт назначения также является параметром ROI. Это верно? или я чего-то не хватает?

После этого результат будет показан с логотипом, добавленным к большому изображению. Где в этих командах было включено большое изображение.

Также перед тем, как задать вопрос, я хотел попробовать сам код, возможно, помочь прояснить ситуацию. но я получаю эту ошибку, поскольку изображение() не распознается: 'image': identifier not found

int _tmain(int argc, _TCHAR* argv[])
{
Mat src1, imageROI, logo;

logo = imread("c:\\car1.jpg", -1);

imageROI= image(Rect(385,270,logo.cols,logo.rows));

addWeighted(imageROI,1.0,logo,0.3,0.,imageROI);


namedWindow("meh", CV_WINDOW_AUTOSIZE);
imshow("meh", imageROI);
waitKey(0);


return 0;

}

Ответ 1

cv::Mat imageROI;
imageROI= image(cv::Rect(385,270,logo.cols,logo.rows));

Конструктор cv:: Mat, который принимает прямоугольник как параметр:

Mat::Mat(const Mat& m, const Rect& roi)

возвращает матрицу, указывающую на ROI исходного изображения, расположенную в месте, указанном прямоугольником. поэтому imageROI - это действительно интересующая область (или подматрица/подматрица) исходного изображения "изображение". Если вы измените imageROI, это, следовательно, изменит исходную большую матрицу.

Что касается вашего примера, проблема в том, что вы вызываете конструктор из объекта, который не существует (изображение). Вы должны заменить:

imageROI= image(Rect(385,270,logo.cols,logo.rows));

по:

imageROI= src1(Rect(385,270,logo.cols,logo.rows));

предполагая, что src1 - это ваше "большое изображение", в которое вы хотите вставить логотип (логотип - car1.jpg). Кстати, не стоит забывать сначала прочитать свое большое изображение, кстати!