基于opencv的视频融合

本文介绍了一个使用OpenCV实现图像融合的实例,通过创建一个类,将三幅图像(原始图像、灰度图像和Canny边缘检测图像)并排显示在一个三倍宽度的新图像中,详细展示了使用指针和ROI方法进行图像融合的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

书上第四章第一个练习题:

创建一个新的图像,其高度与原始图像相同,宽度为原来视频帧的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方法:

结果就自动变成单通道图像了,第一张就自然没有彩色的效果了,

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值