OpenCV进行视频拼接

最近实验室需要做个Demo,要把两个视频拼到一个窗口里面进行播放。于是写了个使用ROI来实现两个视频拼接到一起的代码,但是该代码的前提是两个视频的帧数、宽高都一样。

#include "stdafx.h"
#include <cv.h>   
#include <cvaux.h>   
#include <highgui.h>   
  
#pragma comment(lib, "ml.lib")   
#pragma comment(lib, "cv.lib")   
#pragma comment(lib, "cvaux.lib")   
#pragma comment(lib, "cvcam.lib")   
#pragma comment(lib, "cxcore.lib")   
#pragma comment(lib, "cxts.lib")   
#pragma comment(lib, "highgui.lib")   
#pragma comment(lib, "cvhaartraining.lib") 

int _tmain(int argc, _TCHAR* argv[])
{
	IplImage *newFrame=NULL;
	IplImage *frame1=NULL;
	IplImage *frame2=NULL;
	CvCapture * pCapture1 = cvCaptureFromAVI(argv[1]);
	CvCapture * pCapture2 = cvCaptureFromAVI(argv[2]);
	CvRect rect;
	CvVideoWriter *pWriter=NULL;
	//get the frame number of two videos
	int frameNo1 = (int) cvGetCaptureProperty(pCapture1, CV_CAP_PROP_FRAME_COUNT);
	int frameNo2 = (int) cvGetCaptureProperty(pCapture2, CV_CAP_PROP_FRAME_COUNT);
	if(frameNo1!=frameNo2)
		printf("video length 1 != video length 2\n");
	else
		printf("Total frame numbers: %d\n",frameNo1);
	//get the frame width of two videos
	int frameWidth1 = (int) cvGetCaptureProperty(pCapture1, CV_CAP_PROP_FRAME_WIDTH);
	int frameWidth2 = (int) cvGetCaptureProperty(pCapture2, CV_CAP_PROP_FRAME_WIDTH);
	if(frameWidth1!=frameWidth2)
		printf("video width 1 != video width 2\n");
	else
		printf("frame width: %d\n",frameWidth1);
	//get the frame height of two videos
	int frameHeight1 = (int) cvGetCaptureProperty(pCapture1, CV_CAP_PROP_FRAME_HEIGHT );
	int frameHeight2 = (int) cvGetCaptureProperty(pCapture2, CV_CAP_PROP_FRAME_HEIGHT );
	if(frameHeight1!=frameHeight2)
		printf("video height 1 != video height 2\n");
	else
		printf("frame height: %d\n",frameHeight1);
	//get the video fps
	int fps1 = (int) cvGetCaptureProperty(pCapture1, CV_CAP_PROP_FPS  );
	int fps2 = (int) cvGetCaptureProperty(pCapture2, CV_CAP_PROP_FPS  );
	if(fps1!=fps2)
		printf("video fps 1 != video fps 2\n");
	else
		printf("frame fps: %d\n",fps1);
	
	int initFlag=0;
	int counter=0;
	while((frame1=cvQueryFrame(pCapture1))!=NULL && (frame2=cvQueryFrame(pCapture2))!=NULL )
	{
		printf("%d\n",counter++);
		if(initFlag==0)
		{
			newFrame = cvCreateImage(cvSize(frame1->width*2,frame1->height),frame1->depth,frame1->nChannels);
			pWriter = cvCreateVideoWriter("re.avi",CV_FOURCC('X','V','I','D'),fps1,cvSize(frame1->width*2,frame1->height),1);
			initFlag=1;
		}
		rect.x=0;
		rect.y=0;
		rect.height=frameHeight1;
		rect.width=frameWidth1;
		//use ROI to implement the video split joint
		cvSetImageROI(newFrame, rect);
		cvCopyImage(frame1, newFrame);
		cvResetImageROI(newFrame);
		rect.x = frameWidth1;
		rect.y=0;
		rect.height = frameHeight1;
		rect.width = frameWidth1;
		cvSetImageROI(newFrame, rect);
		cvCopyImage(frame2, newFrame);
		cvResetImageROI(newFrame);
		cvWriteFrame(pWriter, newFrame);
	}
	cvReleaseImage(&frame1);
	cvReleaseImage(&frame2);
	cvReleaseImage(&newFrame);
	cvReleaseVideoWriter(&pWriter)
	return 0;}


要实现opencv全景视频拼接,可以使用以下步骤: 1. 读取视频帧并提取特征点 2. 匹配特征点并计算变换矩阵 3. 将变换矩阵应用于图像并进行拼接 4. 重复步骤2和3直到所有帧都被拼接 以下是一个简单的示例代码: ```python import cv2 import numpy as np # 读取视频 cap = cv2.VideoCapture('video.mp4') # 创建ORB特征检测器 orb = cv2.ORB_create() # 读取第一帧并提取特征点 ret, prev_frame = cap.read() prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY) prev_keypoints, prev_descriptors = orb.detectAndCompute(prev_gray, None) # 创建FLANN匹配器 matcher = cv2.DescriptorMatcher_create(cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_HAMMING) # 创建拼接器 stitcher = cv2.createStitcher() if cv2.__version__.startswith('3') else cv2.Stitcher_create() # 循环读取视频帧并拼接 while True: # 读取下一帧 ret, next_frame = cap.read() if not ret: break next_gray = cv2.cvtColor(next_frame, cv2.COLOR_BGR2GRAY) # 提取特征点并匹配 next_keypoints, next_descriptors = orb.detectAndCompute(next_gray, None) matches = matcher.match(prev_descriptors, next_descriptors) # 计算变换矩阵 src_pts = np.float32([prev_keypoints[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2) dst_pts = np.float32([next_keypoints[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2) M, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) # 应用变换矩阵并拼接图像 result = cv2.warpPerspective(next_frame, M, (prev_frame.shape[1] + next_frame.shape[1], prev_frame.shape[0])) result[0:prev_frame.shape[0], 0:prev_frame.shape[1]] = prev_frame # 更新上一帧和特征点 prev_frame = result prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY) prev_keypoints, prev_descriptors = orb.detectAndCompute(prev_gray, None) # 显示结果 cv2.imshow('Result', result) cv2.waitKey() # 释放资源 cap.release() cv2.destroyAllWindows() ```
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值