1. 程式人生 > >基於opencv的視訊融合

基於opencv的視訊融合

書上第四章第一個練習題:

建立一個新的影象,其高度與原始影象相同,寬度為原來視訊幀的3倍,將3副影象分別複製到新的影象中:

我做成一個類:

#pragma once
#include"cv.h"
#include "highgui.hpp"
using namespace cv;
#include"iostream"
using namespace std;
class opencv_4_1
{
private:
	CvCapture * capture;
	IplImage * img;
	int fps;
	IplImage *gray;
	IplImage *canny;
	IplImage *all;
	CvFont word;
public:
	opencv_4_1();
	~opencv_4_1();
	void initCapture();
	void ans_1();
	void ans_2();
};

標頭檔案:

void opencv_4_1::ans_2() {
	cvNamedWindow("all",0);
	initCapture();
	cvInitFont(&word, CV_FONT_HERSHEY_SCRIPT_COMPLEX, 1, 1, 1.0, 1);
	while (1) {
		img = cvQueryFrame(capture);
		if (!img)break;
		gray = cvCreateImage(CvSize(cvGetSize(img)), img->depth, 1);
        cvConvertImage(img, gray, CV_BGR2GRAY);
		canny = cvCloneImage(gray);
		cvCanny(gray, canny, 10, 30, 3);
		
        cvPutText(gray, "gray", CvPoint(250, 250), &word, CvScalar(255));
		cvPutText(img, "original", CvPoint(250,250), &word, CvScalar(255));
		cvPutText(canny, "canny", CvPoint(250, 250),&word, CvScalar(255));
		
		all = cvCreateImage(CvSize(img->width * 3, img->height), img->depth, img->nChannels);
        //指標方法
		IplImage * part_1 = cvCreateImageHeader(CvSize(cvGetSize(img)), img->depth, img->nChannels);
		IplImage * part_2 = cvCreateImageHeader(CvSize(cvGetSize(img)), img->depth, img->nChannels);
		IplImage * part_3 = cvCreateImageHeader(CvSize(cvGetSize(img)), img->depth, img->nChannels);
		part_1->origin = part_2->origin = part_3->origin = all->origin;
		part_1->widthStep = part_2->widthStep = part_3->widthStep = all->widthStep;

		part_1->imageData = (char *)cvPtr2D(all, 0, 0);
		part_2->imageData = (char *)cvPtr2D(all, 0, img->width);
		part_3->imageData = (char *)cvPtr2D(all, 0, img->width*2);

		cvCopy(img, part_1);
		cvConvertImage(gray, part_2, CV_GRAY2BGR);
		cvConvertImage(canny, part_3, CV_GRAY2BGR);
		/*
		//imageROI
		
		cvSetImageROI(all, CvRect(0, 0, img->width, img->height));
		all->nChannels = img->nChannels;
		cvCopy(img, all);
		cvResetImageROI(all);

		cvSetImageROI(all, CvRect(img->width, 0, gray->width, gray->height));
		all->nChannels = gray->nChannels;
		cvCopy(gray, all);
		cvResetImageROI(all);

		cvSetImageROI(all, CvRect(img->width*2, 0, canny->width, canny->height));
		all->nChannels = canny->nChannels;
		cvCopy(canny, all);
		cvResetImageROI(all);
		*/
		
		cvShowImage("all",all);
		if (cvWaitKey(fps) == 27)break;
	}
	cvDestroyWindow("all");
}

缺點:

融合之後採用指標方法,全部變成三通道函式,效果圖:

採用ROI方法:

結果就自動變成單通道影象了,第一張就自然沒有彩色的效果了,