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

来源:互联网 发布:java final 变量 回收 编辑:程序博客网 时间:2024/05/16 07:26

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

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


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


摆好的场景如下图所示:


老虎在前,恐龙在后,前面红色的就是我们的单目摄像头,看起来是不是很高大上,下篇博客将揭示里面的真面目


相机采集到前后对焦图像如下图所示,(对的并不好,之前可以调的很明显的,晚上光亮什么的都粗糙了)
前对焦:



后对焦:


再来看我们获得深度图像(恐龙的貌似效果很差,有待优化)


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

#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui/highgui.hpp>#include <iostream>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<uchar>(i); //uchar* pfiImage_ROI_data = pfiImage_ROI.ptr<uchar>(i); //uchar* oriPfiImage_data = oriPfiImage.ptr<uchar>(i);         for (int j = 0; j < nc; j++){if(data[j] <120){ pfiImage_ROI.at<Vec3b>(i,j)[0] = oriPfiImage.at<Vec3b>(i,j)[0]; pfiImage_ROI.at<Vec3b>(i,j)[1] = oriPfiImage.at<Vec3b>(i,j)[1]; pfiImage_ROI.at<Vec3b>(i,j)[2] = oriPfiImage.at<Vec3b>(i,j)[2];//pfiImage_ROI_data[j] = oriPfiImage_data[j];}}}namedWindow("result picture",WINDOW_NORMAL);imshow("result picture",pfiImage_ROI);waitKey();return 0;}

效果如下:

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

原创粉丝点击