結構光三維重建-Projector-Camera Calibration投影儀相機標定
目錄
結構光三維重建-Projector-Camera Calibration投影儀相機標定
1.結構光相機標定軟體
2. 依賴環境
2.1 安裝TIFF
2.2 安裝OpenCV
(1) 原始碼編譯
(2) 編譯OpenCV常見錯誤
2.3 安裝QT5
3. 編譯標定原始碼:3D Scanning Software
(1)原始碼編譯
(2)常見的錯誤和解決方法
4.懶人必備
5. 結構光三維重建-3D Scanning Software實作三維重建
1.結構光相機標定軟體
結構光相機標定是一件十分復雜的程序,所幸布朗大學開源了一套投影儀攝像機標定系統(Projector-Camera Calibration/3D Scanning Software)

官方地址: Projector-Camera Calibration / 3D Scanning Software
官網提供了Window和Apple OSX編譯好的標定軟體,很不幸的是,版本比較老舊,僅支持Windows 7 x64,Opencv也是比較老舊的OpenCV 2.4.11,沒有提供Linux版本的,你想在Ubuntu成功運行還是要采坑的,
下面手把手教你,如何在Ubuntu上,編譯原始碼
當然,若你不想經歷填坑的痛苦,可以直接下載本人已經修改好的原始碼,已經包括Opencv,TIFF,scan3d-capture-src-2015等原始碼,直接使用即可
下載地址: https://download.csdn.net/download/guyuealian/36484460
關于如果實作三維重建,請查看下一篇博客《結構光三維重建-3D Scanning Software實作三維重建》:https://panjinquan.blog.csdn.net/article/details/121113787
2. 依賴環境
| 庫 | 本地使用版本 | 說明 |
| Ubuntu | Ubuntu18.04 | 本機系統 |
| tiff | tiff-4.3.0 (tiff-4.0.x以上亦可) | opencv編譯需要TIFF |
| OpenCV | opencv-4.3.0 (opencv-3.2.0.x以上亦可) | 3D Scanning Software需要用的OpenCV |
| Qt | Qt 5.5.1(Qt 5.0.x以上亦可) | 3D Scanning Software的UI是使用Qt布局的 |
2.1 安裝TIFF
下載地址:Index of /libtiff/ ,tiff-4.0.4.tar.gz (tiff-4.0.x以上亦可)
# 解壓tar -zxvf tiff-4.0.4.tar.gz
# 進入tiff目錄
./configure
make
sudo make install
2.2 安裝OpenCV
(1) 原始碼編譯
安裝 OpenCV 所需要的庫,在終端依次執行以下命令:
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
官網下載 OpenCV 4.3.0 的源代碼(下載地址:Releases - OpenCV)并解壓到 opencv4.3.0 目錄,然后進入到 opencv4.3.0 的目錄,執行
mkdir build
cd build
配置 OpenCV 工程檔案
sudo cmake -DBUILD_TIFF=ON -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
PS: 編譯選項中,一定要加上-DBUILD_TIFF=ON, 因為標定系統原始碼需要用到TIFF,否則會出現TIFFReadDirectory@LIBTIFF_4.0’未定義的參考的錯誤
如果執行命令時出現下載 ippicv 失敗,可以參考文章解決:ubuntu編譯安裝opencv3.3+python3
編譯安裝
sudo make install
編譯OpenCV,加上-DBUILD_TIFF=ON選項后,可能會出現以下各種錯誤
(2) 編譯OpenCV常見錯誤
1.error: ‘O_RDONLY’ undeclared
/home/dm/app/opencv-4.3.0/3rdparty/libtiff/tif_close.c: In function ‘TIFFCleanup’:
/home/dm/app/opencv-4.3.0/3rdparty/libtiff/tif_close.c:50:23: error: ‘O_RDONLY’ undeclared (first use in this function)
if (tif->tif_mode != O_RDONLY)

解決方法:在opencv-4.3.0/3rdparty/libtiff/tiff.h頭檔案添加頭檔案#include <fcntl.h>
....
#ifndef _TIFF_
#define _TIFF_
#include "tiffconf.h"
#include <fcntl.h>
....
PS:如果還有類似的錯誤,請在發生錯誤的該原始碼檔案中加入頭檔案#include <fcntl.h>
2.error: conflicting declaration of ‘int _TIFF_snprintf_f
In file included from /home/dm/app/opencv-4.3.0/3rdparty/libtiff/tif_stream.cxx:28:0:
/home/dm/app/opencv-4.3.0/3rdparty/libtiff/tiffiop.h:60:18: error: conflicting declaration of ‘int _TIFF_snprintf_f(char*, size_t, const char*, ...)’ with ‘C’ linkage
#define snprintf _TIFF_snprintf_f

解決方法:宣告存在沖突,應該Linux已經存在了,所以可以注釋opencv-4.3.0/3rdparty/libtiff/tiffiop.h原始碼的下面兩行:
//#define snprintf _TIFF_snprintf_f
//extern int snprintf(char* str, size_t size, const char* format, ...);
3.error: ‘strchr’ was not declared in this scope
/home/dm/app/opencv-4.3.0/3rdparty/libtiff/tif_stream.cxx:361:6: error: ‘strchr’ was not declared in this scope
if( strchr(mode, 'w') ) {
^~~~~~
/home/dm/app/opencv-4.3.0/3rdparty/libtiff/tif_stream.cxx:361:6: note: suggested alternative: ‘strtoq’
if( strchr(mode, 'w') ) {

解決方法:在發生錯誤的該原始碼檔案中opencv-4.3.0/3rdparty/libtiff/tif_stream.cxx加入頭檔案 #include <string.h>
2.3 安裝QT5
官網下載:https://download.qt.io/archive/qt/
清華鏡像:https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/qt/
下載qt-opensource-linux-x64-5.12.4.run (Qt 5.0.x以上亦可)

對于Linux系統,Qt官方的安裝包總是假定C++編譯器compiler、除錯器debugger、生成器make以及其他開發工具 由該作業系統自己提供,另外構建Qt圖形界面程式還需要OpenGL庫檔案(擴展名為 .a 和 .so)和頭檔案(擴展名為 .h), OpenGL的開發庫也是需要作業系統自己提供,所以在安裝Qt官方run檔案之前,必須先安裝好Linux系統自己軟體源里面 的GNU開發工具集和OpenGL開發庫,下面針對三類 Linux 作業系統安裝相應的GNU開發工具集和OpenGL開發庫, 請注意安裝軟體都需要root權限,并且要聯網安裝,
sudo apt-get install build-essential libgl1-mesa-dev
給QT安裝檔案可執行權限:
chmod +x qt-opensource-linux-x64-5.12.4.run
安裝
./qt-opensource-linux-x64-5.12.4.run
QT安裝教程,可參考:https://blog.csdn.net/a435262767/article/details/99317188
安裝后,終端輸入qmake,會出現下截圖,表示QT已經安裝成功:

3. 編譯標定原始碼:3D Scanning Software
(1)原始碼編譯
官方地址: Projector-Camera Calibration / 3D Scanning Software ,把下面的內容都下載下來

解壓scan3d-capture-src-2015.zip
在project/scan3d-capture.pri,配置qmake的opencv路徑:
INCLUDEPATH += /usr/local/include/opencv4 \
/usr/local/include/opencv4/opencv2
LIBS += /usr/local/lib/libopencv_* \

配置好opencv,就可以開始編譯標定原始碼了:
cd scan3d-capture-src
mkdir build
cd build
qmake ../project # 使用QT的qmake進行build
make # (or nmake to build with Microsoft Visual Studio)
每什么意外的話,直接make會出現各種opencv錯誤的,究其原因是opencv版本對應不上,原始碼使用的OpenCV 2.4.11,如果需要更高版本的OpenCV,如OpenCV4.3.0,則需要改動地方挺多
(2)常見的錯誤和解決方法
(1) error: ‘CV_BGR2GRAY’ was not declared in this scope

將所有CV_BGR2GRAY改為cv::COLOR_BGR2GRAY
//cvtColor(rgb_image, gray_image, CV_BGR2GRAY); // 舊版本
cvtColor(rgb_image, gray_image, cv::COLOR_BGR2GRAY);// 新版本
(2)error: ‘CV_RANSAC’ was not declared in this scope

同上,將CV_RANSAC改為cv::RANSAC
//cv::Mat H = cv::findHomography(img_points, proj_points, CV_RANSAC);
cv::Mat H = cv::findHomography(img_points, proj_points, cv::RANSAC);
(3)error: ‘CV_TERMCRIT_EPS’ was not declared in this scope
![]()
將引數CV_TERMCRIT_EPS + CV_TERMCRIT_ITER改為cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER
// cv::cornerSubPix(gray_image, cam_corners, cv::Size(11, 11), cv::Size(-1, -1),
// cv::TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1));
cv::cornerSubPix(gray_image, cam_corners, cv::Size(11, 11), cv::Size(-1, -1),
cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 30, 0.1));
(4)error: no matching function for call to ‘stereoCalibrate

修改引數:cv::stereoCalibrate如下
// calib.stereo_error = cv::stereoCalibrate(world_corners_active, camera_corners_active, projector_corners_active, calib.cam_K, calib.cam_kc, calib.proj_K, calib.proj_kc,
// imageSize /*ignored*/, calib.R, calib.T, E, F,
// cv::TermCriteria(cv::TermCriteria::COUNT + cv::TermCriteria::EPS, 150, DBL_EPSILON),
// cv::CALIB_FIX_INTRINSIC /*cv::CALIB_USE_INTRINSIC_GUESS*/ + cal_flags);
calib.stereo_error = cv::stereoCalibrate(world_corners_active, camera_corners_active, projector_corners_active, calib.cam_K, calib.cam_kc, calib.proj_K, calib.proj_kc,
imageSize /*ignored*/, calib.R, calib.T, E, F,
cv::CALIB_FIX_INTRINSIC /*cv::CALIB_USE_INTRINSIC_GUESS*/ + cal_flags,
cv::TermCriteria(cv::TermCriteria::COUNT + cv::TermCriteria::EPS, 150, DBL_EPSILON));
(5)error: ‘CV_CAP_PROP_FRAME_WIDTH’ was not declared in this scope
(6)error: ‘CV_CAP_PROP_FRAME_HEIGHT’ was not declared in this scope

這些錯誤都是因為版本差異問題導致的,需要改用的地方很多
修改頭檔案VideoInput.hpp:
//CvCapture * _video_capture;
cv::VideoCapture * _video_capture;
修改源檔案VideoInput.cpp,其他地方也參考修改
//cvSetCaptureProperty(_video_capture, CV_CAP_PROP_FRAME_WIDTH, width);
//cvSetCaptureProperty(_video_capture, CV_CAP_PROP_FRAME_HEIGHT, height);
_video_capture->set(cv::CAP_PROP_FRAME_WIDTH, width);
_video_capture->set(cv::CAP_PROP_FRAME_HEIGHT, height);
(7)error: ‘IplImage’ was not declared in this scope
![]()
原始碼修改如下:
while(_video_capture && !_stop && error<max_error)
{
IplImage * frame = cvQueryFrame(_video_capture);
if (frame)
{ //ok
error = 0;
emit new_image(cv::Mat(frame));
}
else
{ //error
if (timer.elapsed()>warmup) {error++;}
}
/*************************改為****************************/
while(_video_capture && !_stop && error<max_error)
{
//IplImage * frame = cvQueryFrame(_video_capture);
cv::Mat frame;
//*_video_capture >> frame;
_video_capture->read(frame);
if (not frame.empty())
{ //ok
error = 0;
emit new_image(cv::Mat(frame));
}
else
{ //error
if (timer.elapsed()>warmup) {error++;}
}
}
(7) error: ‘cvReleaseCapture’ was not declared in this scope
![]()
如下修改:
//cvReleaseCapture(&_video_capture);
_video_capture->release();
(8)error: ‘CV_CAP_V4L2’ was not declared in this scope
將CV_CAP_V4L2修改為cv::CAP_V4L2
(9)error: ‘cvCreateCameraCapture’ was not declared in this scope

修改如下
//_video_capture = cvCreateCameraCapture(CLASS + index);
_video_capture->open(CLASS + index);
最終,最后,,,,,,NND,還有錯
(10)VideoInput.cpp:(.text+0xb73):對‘VideoInput::list_device_resolutions_v4l2(int, bool)’未定義的參考
//list = list_device_resolutions_v4l2(index, silent);
list = list_device_resolutions_dshow(index, silent);
OK,終于成功:
然后,你在 bin目錄就可以找到一個可執行檔案:scan3d-capture,

運行他即可:
./scan3d-capture
千呼萬喚始出來,終于見到這個界面了:

4.懶人必備
兄弟,如果,你不想經歷上面填坑的痛苦,可以直接下載本人已經修改好的原始碼,已經包括Opencv,TIFF,scan3d-capture-src-2015等原始碼,直接使用即可
下載地址: https://download.csdn.net/download/guyuealian/36484460

使用方法,如下:
## 安裝tiff-4.3.0
```bash
cd tiff-4.3.0
./configure
make
sudo make install```
## 安裝OpenCV已經把常見的錯誤,都修改了,可以直接build
```bash
cd opencv-4.3.0
bash build.sh```
## 安裝QT5
```bash
sudo apt-get install build-essential libgl1-mesa-dev
chmod +x qt-opensource-linux-x64-5.12.4.run
./qt-opensource-linux-x64-5.12.4.run```
## 安裝3D Scanning Software已經把常見的錯誤,都修改了,可以直接build
```bash
cd scan3d-capture-src-2015/scan3d-capture-src
mkdir build
cd build
qmake ../project # 使用QT的qmake進行build
make # (or nmake to build with Microsoft Visual Studio)
```## 運行3D Scanning Software
```bash
./bin/scan3d-capture
```
5. 結構光三維重建-3D Scanning Software實作三維重建
關于如果實作三維重建,請查看下一篇博客《結構光三維重建-3D Scanning Software實作三維重建》:https://panjinquan.blog.csdn.net/article/details/121113787

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/349681.html
標籤:其他
上一篇:如何擁有個人博客?
