Наложение изображения при помощи OpenCV / OpenCV / Recog.ru - Распознавание образов для программистов


Наложение изображения при помощи OpenCV

Однажды мне понадобилось совместить два изображения таким образом, чтобы было видно перемещение человека, т.е. не одна фигура на экране, а две – начальная и конечная позиция. Сразу же возникла идея не вручную это делать, а при помощи функции отличий OpenCV. Итак, изначально есть два изображения:




Задача такова, что нужно получить фоновую картинку и картинку с двумя фигурами. На первом изображении обучаем функцию отличий cvCreateFGDStatModel. Ну а затем, при помощи cvUpdateBGStatModel, находим отличия. Вот что получается:



Чтобы получить фон надо на первой картинке вставить отличие первой фигуры, а чтобы получить две фигуры – второй. Конечно, можно автоматизировать процесс полностью, разделив эти две области автоматически, но я этого не делал, предполагая, что между фигурами есть какое-то расстояние и оно мне известно (Вообще тут можно было бы и контуры выделить, а потом определить, что к чему относится. И просто горизонтальную проекцию просчитать, чтобы найти, где границы между фигурами. В общем – способов много и я думаю, что читатель на досуге их попробует, я конкретно здесь приводить не буду, хотя многое из них пробовал).
Ну а далее мы просто с помощью маски копируем нужный участок изображения и получаем фон с фигурой вроде «невидимки»:



И две фигуры:



Листинг программы делающей вышеописанное представлен ниже, он очень простой.

#include <opencv2/video/background_segm.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/core/core_c.h"
#include "opencv2/imgproc/imgproc_c.h"


int main()
{
	IplImage* Img1,* Img2;
	Img1=cvLoadImage("1.jpg");
	Img2=cvLoadImage("2.jpg");

	// Обучение
	CvBGStatModel* bg_model = 0;
	bg_model = cvCreateFGDStatModel( Img1);	

	// Отличия
	cvUpdateBGStatModel( Img2, bg_model, -1);
	cvSaveImage("out_b.jpg",bg_model->background);
	cvSaveImage("out_f.jpg",bg_model->foreground);

	// Получаем фон
	IplImage* ImgCopy;
	ImgCopy=cvCreateImage(cvGetSize(Img1), 8, 3); 
	cvCopy(Img1,ImgCopy);
	CvRect Rect;
	Rect.x=0;Rect.y=0;Rect.width=250;Rect.height=240;
	cvSetImageROI(ImgCopy,Rect); //Rect – размеры области
	cvSetImageROI(Img2,Rect); //Rect – размеры области	
	cvSetImageROI(bg_model->foreground,Rect); //Rect – размеры области	
	cvCopy(Img2,ImgCopy,bg_model->foreground);
	cvResetImageROI(ImgCopy);
	cvResetImageROI(Img2);	
	cvResetImageROI(bg_model->foreground);	
	cvSaveImage("out_fon.jpg",ImgCopy);

	// Получаем две фигуры
	cvCopy(Img1,ImgCopy);
	Rect.x=250;Rect.y=0;Rect.width=70;Rect.height=240;
	cvSetImageROI(ImgCopy,Rect); //Rect – размеры области
	cvSetImageROI(Img2,Rect); //Rect – размеры области	
	cvSetImageROI(bg_model->foreground,Rect); //Rect – размеры области	
	cvCopy(Img2,ImgCopy,bg_model->foreground);
	cvResetImageROI(ImgCopy);
	cvResetImageROI(Img2);	
	cvResetImageROI(bg_model->foreground);	
	cvSaveImage("out_2fig.jpg",ImgCopy);

	cvReleaseImage(&Img1);
	cvReleaseImage(&Img2);
	cvReleaseImage(&ImgCopy);
	return 0;
}


  • 0
  • 14 января 2012, 19:12
  • vidikon

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.