日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

结构光三维重建Projector-Camera Calibration投影仪相机标定

發(fā)布時(shí)間:2024/4/15 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 结构光三维重建Projector-Camera Calibration投影仪相机标定 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

結(jié)構(gòu)光三維重建-Projector-Camera Calibration投影儀相機(jī)標(biāo)定

目錄

結(jié)構(gòu)光三維重建-Projector-Camera Calibration投影儀相機(jī)標(biāo)定

1.結(jié)構(gòu)光相機(jī)標(biāo)定軟件

2. 依賴環(huán)境

2.1 安裝TIFF

2.2 安裝OpenCV

(1) 源碼編譯

(2) 編譯OpenCV常見錯(cuò)誤

2.3 安裝QT5

3. 編譯標(biāo)定源碼:3D Scanning Software

(1)源碼編譯

(2)常見的錯(cuò)誤和解決方法

4.懶人必備

5. 結(jié)構(gòu)光三維重建-3D Scanning Software實(shí)現(xiàn)三維重建


1.結(jié)構(gòu)光相機(jī)標(biāo)定軟件

結(jié)構(gòu)光相機(jī)標(biāo)定是一件十分復(fù)雜的過程,所幸布朗大學(xué)開源了一套投影儀攝像機(jī)標(biāo)定系統(tǒng)(Projector-Camera Calibration/3D Scanning Software)?

官方地址:?Projector-Camera Calibration / 3D Scanning Software

官網(wǎng)提供了Window和Apple OSX編譯好的標(biāo)定軟件,很不幸的是,版本比較老舊,僅支持Windows 7 x64,Opencv也是比較老舊的OpenCV 2.4.11,沒有提供Linux版本的,你想在Ubuntu成功運(yùn)行還是要采坑的。

下面手把手教你,如何在Ubuntu上,編譯源碼

?當(dāng)然,若你不想經(jīng)歷填坑的痛苦,可以直接下載本人已經(jīng)修改好的源碼,已經(jīng)包括Opencv,TIFF,scan3d-capture-src-2015等源碼,直接使用即可

下載地址:?https://download.csdn.net/download/guyuealian/36484460

?關(guān)于如果實(shí)現(xiàn)三維重建,請(qǐng)查看下一篇博客《結(jié)構(gòu)光三維重建-3D Scanning Software實(shí)現(xiàn)三維重建》:https://panjinquan.blog.csdn.net/article/details/121113787


2. 依賴環(huán)境

本地使用版本說明
UbuntuUbuntu18.04本機(jī)系統(tǒng)
tifftiff-4.3.0 (tiff-4.0.x以上亦可)opencv編譯需要TIFF

OpenCV

opencv-4.3.0 (opencv-3.2.0.x以上亦可)3D Scanning Software需要用的OpenCV
?QtQt 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# 進(jìn)入tiff目錄./configuremakesudo make install

2.2 安裝OpenCV

(1) 源碼編譯

安裝 OpenCV 所需要的庫,在終端依次執(zhí)行以下命令:

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

官網(wǎng)下載 OpenCV 4.3.0 的源代碼(下載地址:Releases - OpenCV)并解壓到 opencv4.3.0 目錄,然后進(jìn)入到 opencv4.3.0 的目錄,執(zhí)行

mkdir build cd build

配置 OpenCV 工程文件

sudo cmake -DBUILD_TIFF=ON -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

PS: 編譯選項(xiàng)中,一定要加上-DBUILD_TIFF=ON, 因?yàn)闃?biāo)定系統(tǒng)源碼需要用到TIFF,否則會(huì)出現(xiàn)TIFFReadDirectory@LIBTIFF_4.0’未定義的引用的錯(cuò)誤

如果執(zhí)行命令時(shí)出現(xiàn)下載 ippicv 失敗,可以參考文章解決:ubuntu編譯安裝opencv3.3+python3

編譯安裝

sudo make install

編譯OpenCV,加上-DBUILD_TIFF=ON選項(xiàng)后,可能會(huì)出現(xiàn)以下各種錯(cuò)誤

(2) 編譯OpenCV常見錯(cuò)誤

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:如果還有類似的錯(cuò)誤,請(qǐng)?jiān)诎l(fā)生錯(cuò)誤的該源碼文件中加入頭文件#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

?解決方法:聲明存在沖突,應(yīng)該Linux已經(jīng)存在了,所以可以注釋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') ) {

?解決方法:在發(fā)生錯(cuò)誤的該源碼文件中opencv-4.3.0/3rdparty/libtiff/tif_stream.cxx加入頭文件?#include <string.h>

2.3 安裝QT5

官網(wǎng)下載: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以上亦可)

對(duì)于Linux系統(tǒng),Qt官方的安裝包總是假定C++編譯器compiler、調(diào)試器debugger、生成器make以及其他開發(fā)工具 由該操作系統(tǒng)自己提供,另外構(gòu)建Qt圖形界面程序還需要OpenGL庫文件(擴(kuò)展名為 .a 和 .so)和頭文件(擴(kuò)展名為 .h), OpenGL的開發(fā)庫也是需要操作系統(tǒng)自己提供。所以在安裝Qt官方run文件之前,必須先安裝好Linux系統(tǒng)自己軟件源里面 的GNU開發(fā)工具集和OpenGL開發(fā)庫。下面針對(duì)三類 Linux 操作系統(tǒng)安裝相應(yīng)的GNU開發(fā)工具集和OpenGL開發(fā)庫, 請(qǐng)注意安裝軟件都需要root權(quán)限,并且要聯(lián)網(wǎng)安裝。

sudo apt-get install build-essential libgl1-mesa-dev

給QT安裝文件可執(zhí)行權(quán)限:

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,會(huì)出現(xiàn)下截圖,表示QT已經(jīng)安裝成功:


3. 編譯標(biāo)定源碼:3D Scanning Software

(1)源碼編譯

?官方地址:?Projector-Camera Calibration / 3D Scanning Software? ,把下面的內(nèi)容都下載下來

解壓scan3d-capture-src-2015.zip

在project/scan3d-capture.pri,配置qmake的opencv路徑:

INCLUDEPATH += /usr/local/include/opencv4 \/usr/local/include/opencv4/opencv2LIBS += /usr/local/lib/libopencv_* \

?配置好opencv,就可以開始編譯標(biāo)定源碼了:

cd scan3d-capture-src mkdir build cd build qmake ../project # 使用QT的qmake進(jìn)行build make # (or nmake to build with Microsoft Visual Studio)

每什么意外的話,直接make會(huì)出現(xiàn)各種opencv錯(cuò)誤的,究其原因是opencv版本對(duì)應(yīng)不上,源碼使用的OpenCV 2.4.11,如果需要更高版本的OpenCV,如OpenCV4.3.0,則需要改動(dòng)地方挺多

(2)常見的錯(cuò)誤和解決方法

(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

?將參數(shù)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

修改參數(shù):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

?這些錯(cuò)誤都是因?yàn)榘姹静町悊栴}導(dǎo)致的,需要改用的地方很多

修改頭文件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){ //okerror = 0;emit new_image(cv::Mat(frame));}else{ //errorif (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()){ //okerror = 0;emit new_image(cv::Mat(frame));}else{ //errorif (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,還有錯(cuò)

?(10)VideoInput.cpp:(.text+0xb73):對(duì)‘VideoInput::list_device_resolutions_v4l2(int, bool)’未定義的引用

//list = list_device_resolutions_v4l2(index, silent);list = list_device_resolutions_dshow(index, silent);

OK,終于成功:

然后,你在 bin目錄就可以找到一個(gè)可執(zhí)行文件:scan3d-capture,

運(yùn)行他即可:

./scan3d-capture

千呼萬喚始出來,終于見到這個(gè)界面了:


4.懶人必備

兄弟,如果,你不想經(jīng)歷上面填坑的痛苦,可以直接下載本人已經(jīng)修改好的源碼,已經(jīng)包括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

已經(jīng)把常見的錯(cuò)誤,都修改了,可以直接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

已經(jīng)把常見的錯(cuò)誤,都修改了,可以直接build

```bash
cd scan3d-capture-src-2015/scan3d-capture-src
mkdir build
cd build
qmake ../project # 使用QT的qmake進(jìn)行build
make # (or nmake to build with Microsoft Visual Studio)
```

## 運(yùn)行3D Scanning Software
```bash
./bin/scan3d-capture
```

當(dāng)然,你也可以使用CMAKE來build,已經(jīng)構(gòu)建好:

cmake_minimum_required(VERSION 3.5) project(scan3d-capture)set(CMAKE_CXX_STANDARD 11) #SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11 -lGL -lglut -lGLU ") #SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -g -std=c++11 -lGL -lglut -lGLU")# 配置OpenCV庫 find_package(OpenCV REQUIRED) # 對(duì)應(yīng)的庫:${OpenCV_LIBS} include_directories(${OpenCV_INCLUDE_DIRS} ./src/)# 配置OpenGL依賴庫 # https://blog.csdn.net/weixin_42444571/article/details/115051488 if (POLICY CMP0072)# Fix a Warning: OpenGL_GL_PREFERENCE has not been set to "GLVND" or "LEGACY"set(OpenGL_GL_PREFERENCE LEGACY) endif () find_package(OpenGL REQUIRED)# 對(duì)應(yīng)的庫:${OPENGL_LIBRARIES} include_directories(${OPENGL_INCLUDE_DIRS}) #find_package(GLUT REQUIRED) # 對(duì)應(yīng)的庫:${GLUT_LIBRARIES} #include_directories(${GLUT_INCLUDE_DIRS})# 配置QT set(QT_LIBS Qt5::Core Qt5::Gui Qt5::Widgets) find_package(Qt5 COMPONENTS Core Gui Widgets REQUIRED) set(QT_GL_LIBS Qt5::OpenGL) find_package(Qt5OpenGL REQUIRED) SET(CMAKE_INCLUDE_CURRENT_DIR ON)#如果頭文件中使用了QT,則調(diào)用MOC進(jìn)行處理,相當(dāng)于*.pri配置中的HEADERS QT5_WRAP_CPP(HEADERSsrc/io_util.hppsrc/im_util.hppsrc/Application.hppsrc/MainWindow.hppsrc/AboutDialog.hppsrc/ProcessingDialog.hppsrc/CalibrationDialog.hppsrc/CaptureDialog.hppsrc/VideoInput.hppsrc/ImageLabel.hppsrc/ProjectorWidget.hppsrc/TreeModel.hppsrc/CalibrationData.hppsrc/structured_light.hppsrc/scan3d.hppsrc/GLWidget.hpp) #使用uic將*.ui文件轉(zhuǎn)為對(duì)應(yīng)的頭文件,相當(dāng)于*.pri配置中的FORMS QT5_WRAP_UI(FORMSforms/MainWindow.uiforms/CaptureDialog.uiforms/AboutDialog.uiforms/ProcessingDialog.uiforms/CalibrationDialog.ui)# 源文件 set(SOURCESsrc/io_util.cppsrc/im_util.cppsrc/Application.cppsrc/MainWindow.cppsrc/AboutDialog.cppsrc/CaptureDialog.cppsrc/VideoInput.cppsrc/ProcessingDialog.cppsrc/CalibrationDialog.cppsrc/ImageLabel.cppsrc/ProjectorWidget.cppsrc/TreeModel.cppsrc/CalibrationData.cppsrc/structured_light.cppsrc/scan3d.cppsrc/GLWidget.cpp)#使用rcc處理.qrc文件,相當(dāng)于*.pri配置中的RESOURCES,常見的錯(cuò)誤:‘qInitResources_assets()’未定義的引用 QT5_ADD_RESOURCES(RESOURCES assets/assets.qrc)message(STATUS "USE QT5_WRAP") set(QT_SRC ${HEADERS} ${FORMS} ${RESOURCES}) include_directories(src) add_executable(${PROJECT_NAME} src/main.cpp ${SOURCES} ${QT_SRC}) target_link_libraries(${PROJECT_NAME}${QT_LIBS}${OpenCV_LIBS}${QT_GL_LIBS}${OPENGL_LIBRARIES} )


5. 結(jié)構(gòu)光三維重建-3D Scanning Software實(shí)現(xiàn)三維重建

?關(guān)于如果實(shí)現(xiàn)三維重建,請(qǐng)查看下一篇博客《結(jié)構(gòu)光三維重建-3D Scanning Software實(shí)現(xiàn)三維重建》:https://panjinquan.blog.csdn.net/article/details/121113787

總結(jié)

以上是生活随笔為你收集整理的结构光三维重建Projector-Camera Calibration投影仪相机标定的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。