参考:金书世界

源码工程连接

链接:https://pan.baidu.com/s/1_f7hiRlS5I8ABajAFPT-hw?pwd=vjcm 
提取码:vjcm 

测试环境 

opencv310

vs2022

主要是根据需求实现不同视角的自由切换,当前实现是俯视图想、左视图像和右视图像的输出,测试结果参见下图:

原始图

俯视图

左视图

右视图

当前使用的摄像头安装位置(白色三角的位置就是摄像头的安装位置)

算法的实现

1、根据视角的不同设置不同的相机的旋转矩阵

俯视图像的旋转矩阵设置如下所示

js_initAngle(data_TOP, 90, 0, 0);

左视图像的旋转矩阵设置如下所示

js_initAngle(data_TOP,0, 90, 0);

右视图像的旋转矩阵设置如下所示

js_initAngle(data_TOP,0, -90, 0);

2、初始化相机实际安装的位置参数

js_initAngle(data_0, 25, 0, 0);

3、初始化相机的内参参数

float  a[4] = { 160,-0.0005,0,0 };

4、遍历图像每个点坐标实现坐标的变换并输出各个视图的图像

图片的测试代码

	IplImage* img = cvLoadImage("test1.jpg");
	IplImage* det_TOP = cvCreateImage(cvSize(img->width, img->height), img->depth, img->nChannels);
	IplImage* det_LEFT = cvCreateImage(cvSize(img->width, img->height), img->depth, img->nChannels);
	IplImage* det_RIGHT = cvCreateImage(cvSize(img->width, img->height), img->depth, img->nChannels);
	js_getPlaneImag_TOP(img->imageData, det_TOP->imageData, img->width, img->height, img->nChannels);
	js_getPlaneImag_LEFT(img->imageData, det_LEFT->imageData, img->width, img->height, img->nChannels);
	js_getPlaneImag_RIGHT(img->imageData, det_RIGHT->imageData, img->width, img->height, img->nChannels);
	cvShowImage("img", det_TOP);
	cvWaitKey(0);

图片的测试结果

视频的测试代码

// TODO: 在此添加控件通知处理程序代码
	IplImage* det_TOP = cvCreateImage(cvSize(1280, 720), 8, 3);
	IplImage* det_LEFT = cvCreateImage(cvSize(1280, 720), 8, 3);
	IplImage* det_RIGHT = cvCreateImage(cvSize(1280, 720), 8, 3);
	IplImage* detROI = cvCreateImage(cvSize(384, 216), 8, 3);
	CvVideoWriter* writer = cvCreateVideoWriter("Front_TOP_Result.avi", CV_FOURCC('X', 'V', 'I', 'D'), 25, cvSize(1280, 720));
	cvNamedWindow("视频播放", CV_WINDOW_AUTOSIZE);
	CvCapture* capture = cvCreateFileCapture("Front.avi");
	IplImage* frame;
	while (frame = cvQueryFrame(capture))
	{
		js_getPlaneImag_TOP(frame->imageData, det_TOP->imageData, frame->width, frame->height, frame->nChannels);
		js_getPlaneImag_LEFT(frame->imageData, det_LEFT->imageData, frame->width, frame->height, frame->nChannels);
		js_getPlaneImag_RIGHT(frame->imageData, det_RIGHT->imageData, frame->width, frame->height, frame->nChannels);
		//鱼眼图像
		cvResize(frame, detROI);
		cvSetImageROI(det_TOP, cvRect((frame->width-384)/2, 0, 384, 216));
		cvCopy(detROI, det_TOP);
		cvResetImageROI(det_TOP);

		//左侧图像
		cvResize(det_LEFT, detROI);
		cvSetImageROI(det_TOP, cvRect(0, 0, 384, 216));
		cvCopy(detROI, det_TOP);
		cvResetImageROI(det_TOP);


		//右侧图像
		cvResize(det_RIGHT, detROI);
		cvSetImageROI(det_TOP, cvRect(det_RIGHT->width - 384, 0, 384, 216));
		cvCopy(detROI, det_TOP);
		cvResetImageROI(det_TOP);

		cvWriteFrame(writer, det_TOP);
		cvShowImage("视频播放", det_TOP);
		char c = cvWaitKey(1);
		if (c == 27)break;
	}
	cvReleaseVideoWriter(&writer);
	cvReleaseCapture(&capture);
	cvDestroyWindow("视频播放");

视频测试结果

AVM环视算法的俯视图像

Logo

分享最新的 NVIDIA AI Software 资源以及活动/会议信息,精选收录AI相关技术内容,欢迎大家加入社区并参与讨论。

更多推荐