- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
cv::structured_light::GrayCodePattern 是 OpenCV 庫中用于結構光三維重建 的一個類,屬于 OpenCV 的 structured_light 模塊。
它用于生成和解碼 格雷碼(Gray Code) 圖案,廣泛應用于 3D 掃描、深度重建、物體表面形狀獲取等領域。
主要功能
- 生成一組黑白格雷碼圖像(水平 + 垂直)
- 對相機拍攝的變形格雷碼圖像進行解碼
- 輸出每個像素的“水平”和“垂直”編碼值(即像素在投影圖案中的唯一編碼)
- 可用于計算相機與投影儀之間的像素對應關系(correspondence)
常用成員函數
函數 | 說明 |
---|---|
static Ptr create(Size size); | 創建一個格雷碼圖案生成器,size 是投影圖像的分辨率(如 1024x768) |
bool generate(std::vector& pattern); | 生成格雷碼圖案序列,輸出為一組二值圖像(黑白) |
bool decode(InputArrayOfArrays patternImages, OutputArray disparity, InputArrayOfArrays whiteImages=noArray(), InputArrayOfArrays blackImages=noArray(), InputArray mask=noArray()); | 解碼拍攝的格雷碼圖像序列,輸出視差圖(disparity)或編碼圖 |
int getWidth() const; | 獲取圖案寬度 |
int getHeight() const; | 獲取圖案高度 |
使用流程(典型結構光系統)
一個典型的 結構光 3D 掃描系統 包括:
- 一臺 投影儀(Projector):投射格雷碼圖案
- 一臺 相機(Camera):拍攝被物體變形后的圖案
- 一臺 計算機:運行 OpenCV 處理圖像
步驟:
- 生成格雷碼圖案
cv::Ptr<cv::structured_light::GrayCodePattern> grayPattern = cv::structured_light::GrayCodePattern::create(cv::Size(1024, 768));std::vector<cv::Mat> patternImages;
grayPattern->generate(patternImages); // 生成 ~20 張黑白圖像
-
依次投影圖案,并用相機拍攝
- 投影第 i 張圖 → 相機拍攝第 i 張變形圖 → 存入 capturedImages[i]
-
解碼拍攝的圖像
cv::Mat disparity;
bool success = grayPattern->decode(capturedImages, disparity);
if (success) {
// disparity 包含每個像素的水平編碼值(可用于 3D 重建)
}
- 結合相機標定、投影儀標定,計算三維點云
📌 注意事項
- disparity 圖實際上是 水平方向的編碼值,類似于“相位”,可用于匹配相機和投影儀的像素。
- 通常還需要配合 正弦條紋(Phase Shift) 方法進行亞像素級精度提升。
- structured_light 模塊在 OpenCV 3.0+ 引入,需編譯時啟用 opencv_contrib 模塊。
- 必須安裝 opencv-contrib,否則無法使用該類!
應用場景
- 工業零件三維掃描
- 人臉識別與建模
- 醫療三維成像
- 虛擬現實內容生成
示例代碼
#include <opencv2/opencv.hpp>
#include <opencv2/structured_light.hpp>int main()
{int width = 1024;int height = 768;auto pattern = cv::structured_light::GrayCodePattern::create( width, height );std::vector< cv::Mat > images;pattern->generate( images );// 保存所有圖案for ( size_t i = 0; i < images.size(); ++i ){cv::imwrite( "pattern_" + std::to_string( i ) + ".png", images[ i ] );}return 0;
}