Понимание региона интереса к 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). Кстати, не стоит забывать сначала прочитать свое большое изображение, кстати!