结构光三维重建-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目录./configuremakesudo 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/opencv2LIBS += /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){   //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,还有错

 (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
```

当然,你也可以使用CMAKE来build,已经构建好:

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) # 对应的库:${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)# 对应的库:${OPENGL_LIBRARIES}
include_directories(${OPENGL_INCLUDE_DIRS})
#find_package(GLUT REQUIRED) # 对应的库:${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,则调用MOC进行处理,相当于*.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文件转为对应的头文件,相当于*.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文件,相当于*.pri配置中的RESOURCES,常见的错误:‘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. 结构光三维重建-3D Scanning Software实现三维重建

关于如果实现三维重建,请查看下一篇博客《结构光三维重建-3D Scanning Software实现三维重建》:https://panjinquan.blog.csdn.net/article/details/121113787

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

  1. 双目三维重建_系列篇|结构光三维重建基本原理

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 结构光三维重建系统是由一个相机和一个投影仪组成,关于结构光三维重建系统的理论有很多,其中有一个简单的模 ...

  2. matlab棋盘格标定角点,相机标定(Camera calibration)Matlab——棋盘格标定原理,流程...

    计算机视觉----相机标定 相机标定概念:图像测量过程以及计算器视觉中,为确定空间物体某点的三维几何关系位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,模型的参数就是相机的参数.求解 ...

  3. 结构光三维重建基本原理

    点击进入->3D视觉工坊学习交流群 结构光三维重建系统是由一个相机和一个投影仪组成,关于结构光三维重建系统的理论有很多,其中有一个简单的模型是把投影仪看做相机来使用,从而得到物体的三维信息.接下 ...

  4. 结构光三维重建-3D Scanning Software实现三维重建

    结构光三维重建-3D Scanning Software实现三维重建 目录 结构光三维重建-3D Scanning Software三维重建 1. 说明 2.Requirements (1)下载相关文 ...

  5. 结构光三维重建1——四步相移原理

    一.简介 结构光三维重建主要的原理就是从投影仪中投影出特定图案的结构光,然后通过对多组结构光的分析计算,得到投影仪像素与相机像素的对应关系,进而通过事先标定好的系统参数,实现所拍物体的三维重建. 下面 ...

  6. 线结构光三维重建(一)

     线结构光三维重建测量系统,是基于三角测量的原理进行三维重建.相机在采集图像过程中,对相机进行内外参标定后,我们可以将图像上的像素点坐标,转为世界坐标进行测量.但由于小孔成像的原理,对于目标距离光心的 ...

  7. 三维重建【四】-------------------结构光 三维重建----论文调研

    1. 动态目标实时三维重建-结构光方案 动态目标 三维重建 Stripe boundary codes for real-time structured-light range scanning of ...

  8. 重磅直播|计算深度分割技术的实现与全局效应下的结构光三维重建

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 大家好,本公众号现已开启线上视频公开课,主讲人通过B站直播间,对3D视觉领域相关知识点进行讲解,并在微 ...

  9. opencv线结构光三维重建

    下面是从CSDN下载的一个程序,用到了其他的一些库,大致实现了HALCON示例中的线结构光三维重建的功能,下面是完整代码,具体解释见注释 #include <opencv2/highgui/hi ...

最新文章

  1. 短短的 RESTful API 设计规范
  2. js复制input 框中的值
  3. 文巾解题 67. 二进制求和
  4. wxpython实现鼠标拖动事件
  5. Android开发之RadioButton选择改变字体颜色与背景色
  6. sqlserver创建程序集
  7. oracle Expdp带条件,Oracle 11g expdp中query参数的使用
  8. Linux内核hlist数据结构分析
  9. win7x64 连接oracle 客户端 vs 2010调试 提示“ORA-12154: TNS: 无法解析指定的连接标识符 ”
  10. 图像拼接算法(zz)
  11. ubuntu中安装flash播放器
  12. TVS参数详解及选型应用
  13. 统计笔记4:ANOVA
  14. 一切免费的大学视频教程,免费空间和网盘
  15. vue 2 组件之间传值
  16. 双宽带双路由搭建同一网段局域网
  17. 安全模式里一键删除360卫士、杀毒、安全浏览器、压缩
  18. 2022年6月13日-6月24日(ue4视频教程,15小时,合计1366小时,剩余8634小时。)
  19. 怎么关闭手机热点通知显示_关闭智能手机通知的重要性
  20. 戴眼镜最近眼睛很累,感觉有压力一样,眼压过大;摘掉眼镜后,感觉又好一些,求专业人士原因?

热门文章

  1. 理解 neutron(15):Neutron Linux Bridge + VLAN/VXLAN 虚拟网络
  2. WEB程序打包详解:(连接SQL2005数据库,修改配置文件,建立虚拟目录)
  3. The Definitive Guide to SWT and JFace 目录
  4. 根据 dba_errors 制定 数据库报警邮件
  5. Hibernate中的inverse属性和cascade属性
  6. notepad++的NppFTP插件远程连接linux操作系统
  7. 6. H.264/AVC编码器原理
  8. Python发送邮件以及自动化测试报告的生成
  9. Python学习(四) —— 编码
  10. [ 测试管理 ] 如何描述缺陷报告?