OpenCV-带有深度信息图的贴图(增强现实)

OpenCV创建Mat矩阵并进行带有深度信息的贴图

贴图是一件很简单得事情,我利用单目深度图像的算法进行得到的深度图信息进行贴图,也就是图片会根据深度信息进行该显示的地方显示,不该显示的地方遮挡,听起来是不是很有趣。
表示愿意活在二次元的世界里出不来
OpenCV-带有深度信息图的贴图(增强现实)_第1张图片

首先利用实验室的几个小动物创建场景,我们要做的事情很简单,将老虎和恐龙进行先后放置,然后把那匹马儿的图像插入恐龙和老虎之间,计算机会根据深度信息进行合理的显示马儿的身体部分,被前面老虎遮挡的部分则不显示,以往的贴图则是直接显示马儿,后面将重合的部分一点点的消除掉才会达到这种效果。(要用到的小动物依次排队,如下图所示
OpenCV-带有深度信息图的贴图(增强现实)_第2张图片

摆好的场景如下图所示:

OpenCV-带有深度信息图的贴图(增强现实)_第3张图片
老虎在前,恐龙在后,前面红色的就是我们的单目摄像头,看起来是不是很高大上,下篇博客将揭示里面的真面目


相机采集到前后对焦图像如下图所示,(对的并不好,之前可以调的很明显的,晚上光亮什么的都粗糙了)
前对焦:
OpenCV-带有深度信息图的贴图(增强现实)_第4张图片


后对焦:
OpenCV-带有深度信息图的贴图(增强现实)_第5张图片

再来看我们获得深度图像(恐龙的貌似效果很差,有待优化)
OpenCV-带有深度信息图的贴图(增强现实)_第6张图片

好了,接下来直接上代码与效果图

#include 
#include 
#include 
#include 

using namespace std;
using namespace cv;
int main()
{
	Mat horseImage = cv::imread("horseBlack1.bmp"); //马的图片放在工程第一层目录下即可
	cv::Mat mask = cv::imread("horseBlack1.bmp",0);
	Mat pfiImage = imread("Image.jpg");
	cv::Mat pfiImage_ROI = pfiImage(cv::Rect(0,342,2592,1260));
	cv::Mat oriPfiImage=pfiImage_ROI.clone();
	int value_width = 620;
	cv::Mat imageROI = pfiImage_ROI(cv::Rect(value_width,200,horseImage.cols,horseImage.rows));
	horseImage.copyTo(imageROI,mask);
	namedWindow("source",WINDOW_NORMAL);
	imshow("source",pfiImage_ROI);
	cv::Mat depthImage = cv::imread("m_depth.bmp",0);
	
	int nr = depthImage.rows;
	int nc = depthImage.cols;

	for(int i = 0;i < nr;i++)
	 {
		 uchar* data = depthImage.ptr(i);
		 //uchar* pfiImage_ROI_data = pfiImage_ROI.ptr(i);
		 //uchar* oriPfiImage_data = oriPfiImage.ptr(i);
         for (int j = 0; j < nc; j++)
			{
				if(data[j] <120)
				{
					 pfiImage_ROI.at(i,j)[0] = oriPfiImage.at(i,j)[0];
					 pfiImage_ROI.at(i,j)[1] = oriPfiImage.at(i,j)[1];
					 pfiImage_ROI.at(i,j)[2] = oriPfiImage.at(i,j)[2];
					//pfiImage_ROI_data[j] = oriPfiImage_data[j];
				}
			}
	}
	namedWindow("result picture",WINDOW_NORMAL);
	imshow("result picture",pfiImage_ROI);
	waitKey();
	return 0;
}

效果如下:

不是很好,哈哈,到此就结束了
深度图获取的不太好,有好的方法可以一起讨论!
参考链接:小魏的修行路

你可能感兴趣的:(opencv)