1. 程式人生 > >OpenCV-帶有深度資訊圖的貼圖(增強現實)

OpenCV-帶有深度資訊圖的貼圖(增強現實)

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;
}

效果如下:

不是很好,哈哈,到此就結束了吐舌頭 深度圖獲取的不太好,有好的方法可以一起討論!