1. 程式人生 > >用VS+Opencv3.1從雙目立體視差圖中重建三維點雲

用VS+Opencv3.1從雙目立體視差圖中重建三維點雲

基本原理

雙目立體視覺幾何原理圖

基本流程

點雲重建基本流程

程式碼

本程式碼執行需要在VS上配置好opencv3.1+openNI+PCL,opencv3.1的配置可以在網上找到很多資料,openNI和PCL的配置可以參看上一篇博文下http://blog.csdn.net/u014283958/article/details/52599457
下面是程式碼:

//by shuishui shiwenjun 20160926
#include <pcl/visualization/cloud_viewer.h>
#include <iostream>  
#include <pcl/io/io.h>  
#include <pcl/io/pcd_io.h> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; using namespace pcl; int user_data; //相機內參,根據輸入改動 const double u0 = 1329.49 / 4;//由於後面resize成原圖的1/4所以有些引數要縮小相同倍數 const double v0 = 954.485 / 4; const double fx = 6872.874 / 4; const double fy = 6872.874
/ 4; const double Tx = 174.724; const double doffs = 293.97 / 4; void viewerOneOff(visualization::PCLVisualizer& viewer) { viewer.setBackgroundColor(0.0, 0.0, 0.0); } int main() { PointCloud<PointXYZRGB> cloud_a; PointCloud<PointXYZRGB>::Ptr cloud(new PointCloud<PointXYZRGB>); Mat color1 = imread("im0.png"
); Mat depth = imread("Sword1_perfect_d.png"); ////Resize //color1.resize(); Mat color; resize(color1, color, Size(color1.cols/4,color1.rows/4), 0, 0, CV_INTER_LINEAR); //imshow("h",color); //waitKey(0); int rowNumber = color.rows; int colNumber = color.cols; cloud_a.height = rowNumber; cloud_a.width = colNumber; cloud_a.points.resize(cloud_a.width * cloud_a.height); for (unsigned int u = 0; u < rowNumber; ++u) { for (unsigned int v = 0; v < colNumber; ++v) { /*unsigned int num = rowNumber*colNumber-(u*colNumber + v)-1;*/ unsigned int num = u*colNumber + v; double Xw = 0, Yw = 0, Zw = 0; Zw = fx*Tx / (((double)depth.at<Vec3b>(u, v)[0]) + doffs); Xw = (v+1 - u0) * Zw / fx; Yw = (u+1 - v0) * Zw / fy; cloud_a.points[num].b = color.at<Vec3b>(u, v)[0]; cloud_a.points[num].g = color.at<Vec3b>(u, v)[1]; cloud_a.points[num].r = color.at<Vec3b>(u, v)[2]; cloud_a.points[num].x = Xw; cloud_a.points[num].y = Yw; cloud_a.points[num].z = Zw; } } *cloud = cloud_a; visualization::CloudViewer viewer("Cloud Viewer"); viewer.showCloud(cloud); viewer.runOnVisualizationThreadOnce(viewerOneOff); while (!viewer.wasStopped()) { user_data = 9; } return 0; }

效果圖

“Sword1_perfect_d.png”
“Sword1_perfect_d”

輸出:
點雲截圖1
點雲截圖1
點雲截圖2
點雲截圖2
點雲截圖3
點雲截圖3

相關推薦

VS+Opencv3.1雙目立體視差重建

基本原理 基本流程 程式碼 本程式碼執行需要在VS上配置好opencv3.1+openNI+PCL,opencv3.1的配置可以在網上找到很多資料,openNI和PCL的配置可以參看上一篇博文下http://blog.csd

雙目立體視差計算

clc; clear; %% 載入2張立體影象 left = imread('left.png'); right = imread('right.png'); sizeI = size(left); % 顯示覆合影象 zero = zeros(sizeI(1), sizeI

PCL庫看依賴的相關知識

       第一次使用PCL庫還是2017年,當時為了提取火線(火場包絡線:凹包),因為凸包雖然很簡單,但是不符合實際火場分佈的情況,於是查詢到了PCL可以實現,於是熬了幾個夜,走馬觀花的安裝、測試最終參考程式碼實現了想要的功能,但是PCL真的是連一知半

【python學習筆記】正則表示式含中文的網頁提取資料(含編碼轉換)

目標:用正則表示式從含中文的網頁中提取資料 1、獲得網頁全部資料 1.1思考過程 確定我們要操作的網頁:url = 'http://q.stock.sohu.com/cn/603077/cwzb.shtml' 開啟要操作的網頁:req = urllib2.open(url)

《逐夢旅程 WINDOWS遊戲編程之零開始》筆記8——載入模型&Alpha混合技術&深度測試與Z緩存

one 平面 rep none pes x文件 mas 參數 函數 第17章 三維遊戲模型的載入 主要是如何從3ds max中導出.X文件,以及如何從X文件加載三維模型到DirextX遊戲程序裏。因為復雜的3D物體,要用代碼去實現,那太反人類了,所以我們需要一些建模軟件。

種關系包括、擴展、泛化

不一致 sans bottom 決定 rac mod use 微軟 維護 用例圖使用戶 與開發者交流的一種重要的方式,是對用戶需求的一種描寫敘述。開發者從用戶的角度總體上理解系統的功能。 用例圖主要有三種元素:參與

VS2013 txt檔案讀取的陣列

從MATLAB中儲存的二維陣列839*3的資料到txt檔案中,格式化儲存方式如下: matlab程式碼: Pp2=[x;y;z]'; fid = fopen('a.txt','wt'); [m,n]=size(Pp2); for i=1:1:m for j=1:1

雙目求解影象中點的空間座標

首先用MATLAB求內參和外參。 方法1: https://blog.csdn.net/qq_15947787/article/details/53366592 不過該座標可能有問題。 方法2: https://blog.csdn.net/heyijia0327/article/detail

神經網路的現狀、未來(BP—CNN—RNN—GAN—GNN網路—CAP卷積膠囊模型及融合)

人工神經網路是計算智慧和機器學習研究的最活躍的分支之一 ,它是從人腦的生理結構出發 ,探討人類智慧活動的機理 。 從 1943 年 McCulloch 和 Pit ts 首先提出 M P 神經元數學模型開始 ,神經網路的研究大致經過了 1947 ~ 1969 年

雙目立體視覺匹配演算法之視差disparity計算——SAD演算法、SGBM演算法

一、SAD演算法 1.演算法原理         SAD(Sum of absolute differences)是一種影象匹配演算法。基本思想:差的絕對值之和。此演算法常用於影象塊匹配,將每個畫素對應數值之差的絕對值求和,據此評估兩個影象塊的相似度。該演

編寫一個ArrayList類,來儲存1到10之間的數,打亂順序後輸出,按從小到大輸出,按大到小輸出。

/** * Created by whp on 2018/7/30. */ public class Test { public static void main(String[] args) { List list = new ArrayList();

1. 雙目立體視覺演算法

流程圖 矯正 矯正兩個相機之間的R t和畸變,使兩個相機的成像平面滿足: 兩幅圖嚴格的行對應 兩幅影象的對極線恰好在同一水平線上 極線約束 與 極線匹配 極線約束:空間中任意一點在影象平面上的投影點,必然處於該點和兩個攝像頭光心組成的對極平面上

雙目立體匹配經典演算法之Semi-Global Matching(SGM)概述:視差計算、視差優化

文章目錄 視差計算 視差優化 剔除錯誤匹配 提高視差精度 抑制噪聲 視差計算   在SGM演算法中,視差計算採用贏家通吃(WTA)演算法,每個畫素選擇最小聚

VS2017+OpenCV3.3基於SGBM演算法的雙目立體視覺、雙目測距(雙目校正和立體匹配)

前些日子做了一個關於雙目立體視覺的入門作業,現在在這裡總結一下學到的一些知識(寫的可能會有很多欠缺的地方,還望海涵!) 本篇部落格不涉及雙目標定的知識,關於雙目標定網上資料很多,大家可以自行查詢學習。 先說一下本部落格的雙目立體視覺的實現基礎,已知以下資訊:

重建學習(5):簡單地數學原理層面理解雙目立體視覺

前言 這是我前段時間學習雙目視覺時做的筆記,這一篇文章不會進行過於細緻的推導,僅僅會在一些理想情況下做一些簡單的推導,目標是得到一個直觀上的認識:雙目視覺是如何得到三維立體座標的。以後的部落格還會再放上一些詳細的推導,和對雙目視覺提取景深的程式實現。嘛,先一步

Android Studio2.2.2以後版本CMake方法配置OpenCV3.1.0完善版

1、新建一個支援c++的工程 2、修改app目錄下的build.gradle,在defaultConfig新增 將OpenCV-Android-sdk\sdk\native\libs下的libs檔案件拷到工程的main目錄下,並重命名為jniLibs 在android{}下

OPENCV3.0 雙目立體標定

這裡是在上一篇單目標定的基礎上拓展來的進行雙目標定的程式。 在這個程式裡面,預設是先對兩個攝像頭分別進行了單目標定的,也就是說相機的內參數和畸變向量是知道了的。 所以在進行標定的時候,引數選擇的是CALIB_USE_INTRINSIC_GUESS。 此程式依然是使用系統自帶

通過Daffodil for VS使VS2010的IDE可以VC6 VC7.1 VC9等編譯器進行專案編譯

本文內容中的部分資料和知識來源於網路,具體引用出處不明. http://www.cnblogs.com/Athrob/archive/2012/06/06/2538711.html VS的IDE從VC6到VS2010的變化可謂是天翻地覆,最新的VS2010有一個特性

執行OpenCV3.4.1雙目相機標定例程註釋,OpenCV3.4.1+VS2017安裝配置

新版本總是在迭代升級,目前opencv最新版本為3.4.1VS已經到了2017版本,由於opencv每個版本對應的VS都需要有不同的配置,這裡也是鼓搗了好幾天才完成配置,並且跑完這個雙目標定的例程,期間踩了不少坑,下面貼出來分享給小夥伴,同時還有程式註釋opencv安裝:ht

[大數據]-Elasticsearch5.3.1+Kibana5.3.1單機到分布式的安裝與使用<2>

amp fault hang 終端 bject pre 定義 地理 類型 前言:上篇[大數據]-Elasticsearch5.3.1+Kibana5.3.1從單機到分布式的安裝與使用<1>中介紹了ES ,Kibana的單機到分布式的安裝,這裏主要是介紹Elast