OpenCV-帶有深度資訊圖的貼圖(增強現實)
阿新 • • 發佈:2018-12-30
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; }
效果如下:
不是很好,哈哈,到此就結束了 深度圖獲取的不太好,有好的方法可以一起討論!