binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparitybinocular_disparity双目视差(算子)
名称
binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparitybinocular_disparity — 使用相关技术计算校正图像对的视差。
签名
binocular_disparity(ImageRect1, ImageRect2 : Disparity, Score : Method, MaskWidth, MaskHeight, TextureThresh, MinDisparity, MaxDisparity, NumLevels, ScoreThresh, Filter, SubDisparity : )
Herror binocular_disparity(const Hobject ImageRect1, const Hobject ImageRect2, Hobject* Disparity, Hobject* Score, const char* Method, const Hlong MaskWidth, const Hlong MaskHeight, double TextureThresh, const Hlong MinDisparity, const Hlong MaxDisparity, const Hlong NumLevels, double ScoreThresh, const char* Filter, const char* SubDisparity)
Herror T_binocular_disparity(const Hobject ImageRect1, const Hobject ImageRect2, Hobject* Disparity, Hobject* Score, const Htuple Method, const Htuple MaskWidth, const Htuple MaskHeight, const Htuple TextureThresh, const Htuple MinDisparity, const Htuple MaxDisparity, const Htuple NumLevels, const Htuple ScoreThresh, const Htuple Filter, const Htuple SubDisparity)
void BinocularDisparity(const HObject& ImageRect1, const HObject& ImageRect2, HObject* Disparity, HObject* Score, const HTuple& Method, const HTuple& MaskWidth, const HTuple& MaskHeight, const HTuple& TextureThresh, const HTuple& MinDisparity, const HTuple& MaxDisparity, const HTuple& NumLevels, const HTuple& ScoreThresh, const HTuple& Filter, const HTuple& SubDisparity)
HImage HImage::BinocularDisparity(const HImage& ImageRect2, HImage* Score, const HString& Method, Hlong MaskWidth, Hlong MaskHeight, const HTuple& TextureThresh, Hlong MinDisparity, Hlong MaxDisparity, Hlong NumLevels, const HTuple& ScoreThresh, const HTuple& Filter, const HString& SubDisparity) const
HImage HImage::BinocularDisparity(const HImage& ImageRect2, HImage* Score, const HString& Method, Hlong MaskWidth, Hlong MaskHeight, double TextureThresh, Hlong MinDisparity, Hlong MaxDisparity, Hlong NumLevels, double ScoreThresh, const HString& Filter, const HString& SubDisparity) const
HImage HImage::BinocularDisparity(const HImage& ImageRect2, HImage* Score, const char* Method, Hlong MaskWidth, Hlong MaskHeight, double TextureThresh, Hlong MinDisparity, Hlong MaxDisparity, Hlong NumLevels, double ScoreThresh, const char* Filter, const char* SubDisparity) const
HImage HImage::BinocularDisparity(const HImage& ImageRect2, HImage* Score, const wchar_t* Method, Hlong MaskWidth, Hlong MaskHeight, double TextureThresh, Hlong MinDisparity, Hlong MaxDisparity, Hlong NumLevels, double ScoreThresh, const wchar_t* Filter, const wchar_t* SubDisparity) const
(
Windows only)
static void HOperatorSet.BinocularDisparity(HObject imageRect1, HObject imageRect2, out HObject disparity, out HObject score, HTuple method, HTuple maskWidth, HTuple maskHeight, HTuple textureThresh, HTuple minDisparity, HTuple maxDisparity, HTuple numLevels, HTuple scoreThresh, HTuple filter, HTuple subDisparity)
HImage HImage.BinocularDisparity(HImage imageRect2, out HImage score, string method, int maskWidth, int maskHeight, HTuple textureThresh, int minDisparity, int maxDisparity, int numLevels, HTuple scoreThresh, HTuple filter, string subDisparity)
HImage HImage.BinocularDisparity(HImage imageRect2, out HImage score, string method, int maskWidth, int maskHeight, double textureThresh, int minDisparity, int maxDisparity, int numLevels, double scoreThresh, string filter, string subDisparity)
def binocular_disparity(image_rect_1: HObject, image_rect_2: HObject, method: str, mask_width: int, mask_height: int, texture_thresh: Union[float, int], min_disparity: int, max_disparity: int, num_levels: int, score_thresh: Union[float, int], filter: MaybeSequence[str], sub_disparity: str) -> Tuple[HObject, HObject]
描述
binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparityBinocularDisparitybinocular_disparity 通过相关性技术计算两幅校正图像间的像素级对应关系。与 binocular_distancebinocular_distanceBinocularDistanceBinocularDistanceBinocularDistancebinocular_distance 不同,其结果不会转换为距离值。
该算法需要一张参考图像 ImageRect1ImageRect1ImageRect1ImageRect1imageRect1image_rect_1 和一张搜索图像 ImageRect2ImageRect2ImageRect2ImageRect2imageRect2image_rect_2,两者必须经过校正处理,即对应的极线相互平行且位于相同的图像行上()。若该假设不成立,可通过
calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCamerascalibrate_cameras、gen_binocular_rectification_mapgen_binocular_rectification_mapGenBinocularRectificationMapGenBinocularRectificationMapGenBinocularRectificationMapgen_binocular_rectification_map 和 map_imagemap_imageMapImageMapImageMapImagemap_image 算子对图像进行校正。因此,对于参考图像
ImageRect1ImageRect1ImageRect1ImageRect1imageRect1image_rect_1 中的某个像素,通过在 ImageRect2ImageRect2ImageRect2ImageRect2imageRect2image_rect_2 中沿对应行搜索,并匹配尺寸为 MaskWidthMaskWidthMaskWidthMaskWidthmaskWidthmask_width ×
MaskHeightMaskHeightMaskHeightMaskHeightmaskHeightmask_height 的矩形窗口内的局部邻域,从而选定
ImageRect2ImageRect2ImageRect2ImageRect2imageRect2image_rect_2 中的对应像素。像素对应关系通过单通道视差图像 DisparityDisparityDisparityDisparitydisparitydisparity 中的 返回,该图像为参考图像 ImageRect1ImageRect1ImageRect1ImageRect1imageRect1image_rect_1 中的每个像素 指定 ImageRect2ImageRect2ImageRect2ImageRect2imageRect2image_rect_2 中合适的匹配像素
,其计算依据为
。每个视差值的质量度量值存储于 ScoreScoreScoreScorescorescore 中,该值包含参考像素匹配函数 S 的最佳匹配结果。匹配过程直接采用原始未处理图像的灰度值。
所使用的匹配函数由参数
MethodMethodMethodMethodmethodmethod 定义,该参数分配三种不同的相关性:
-
'sad'"sad""sad""sad""sad""sad":绝对差值之和
其中 。
-
'ssd'"ssd""ssd""ssd""ssd""ssd":平方差之和
其中 。
-
'ncc'"ncc""ncc""ncc""ncc""ncc":归一化互相关
其中 。
其中
、、、:两幅输入图像中对应像素的行和列坐标,
、:未处理输入图像的灰度值,
:相关性窗口的大小
:在宽度为
、高度为 的相关窗口内的均值。
请注意,'sad'"sad""sad""sad""sad""sad" 和 'ssd'"ssd""ssd""ssd""ssd""ssd" 方法直接比较掩模窗口内像素的灰度值,而
'ncc'"ncc""ncc""ncc""ncc""ncc" 方法则会补偿掩模窗口内的平均灰度值及其方差。因此,当两幅图像存在亮度和对比度差异时,应优先选用此方法。对于亮度和对比度相似的图像,则推荐使用 'sad'"sad""sad""sad""sad""sad" 和
'ssd'"ssd""ssd""ssd""ssd""ssd" 方法,因其内部计算复杂度较低而运行速度更快。
需要注意的是,对于上升的
,相关性质量在 'sad'"sad""sad""sad""sad""sad" 和 'ssd'"ssd""ssd""ssd""ssd""ssd" 方法中呈下降趋势(最佳质量值为 0),而在 'ncc'"ncc""ncc""ncc""ncc""ncc"
方法中则呈上升趋势(最佳质量值为1.0)。
相关窗口的大小由
和 表示,必须为奇数,并通过
MaskWidthMaskWidthMaskWidthMaskWidthmaskWidthmask_width 和 MaskHeightMaskHeightMaskHeightMaskHeightmaskHeightmask_height 参数传递。搜索空间受最小视差值
MinDisparityMinDisparityMinDisparityMinDisparityminDisparitymin_disparity 和最大视差值 MaxDisparityMaxDisparityMaxDisparityMaxDisparitymaxDisparitymax_disparity 的限制。由于图像边界之外的像素值未定义,因此
DisparityDisparityDisparityDisparitydisparitydisparity 和 ScoreScoreScoreScorescorescore 的域在图像边界处未设置:上下边界各保留 (MaskHeightMaskHeightMaskHeightMaskHeightmaskHeightmask_height-1)/2 的高度边界,左右边界各保留 (MaskWidthMaskWidthMaskWidthMaskWidthmaskWidthmask_width-1)/2 的宽度边界。基于相同原因,图像左右边界处的最大视差范围亦相应缩减。
由于匹配在处理纹理较差的区域时可靠性极低,可在
TextureThreshTextureThreshTextureThreshTextureThreshtextureThreshtexture_thresh 中定义相关窗口内灰度值的最小统计分布范围。该阈值同时应用于输入图像 ImageRect1ImageRect1ImageRect1ImageRect1imageRect1image_rect_1 和 ImageRect2ImageRect2ImageRect2ImageRect2imageRect2image_rect_2。此外,
ScoreThreshScoreThreshScoreThreshScoreThreshscoreThreshscore_thresh 通过设定相关函数的最大值('sad'"sad""sad""sad""sad""sad",'ssd'"ssd""ssd""ssd""ssd""ssd")或最小值('ncc'"ncc""ncc""ncc""ncc""ncc")来保证匹配质量。将
FilterFilterFilterFilterfilterfilter 设为 'left_right_check'"left_right_check""left_right_check""left_right_check""left_right_check""left_right_check"可增强匹配结果的稳健性,因其同时依赖正向与反向匹配;而选择 'none'"none""none""none""none""none"
则关闭该功能。
用于提升
binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparityBinocularDisparitybinocular_disparity 时间响应的金字塔层数由
NumLevelsNumLevelsNumLevelsNumLevelsnumLevelsnum_levels 参数决定。遵循粗到细的方案,先计算高阶视差图像,再将其分割为视差相似的矩形子图像,从而缩小下一低阶金字塔层的视差范围。纹理阈值(TextureThreshTextureThreshTextureThreshTextureThreshtextureThreshtexture_thresh)与分数阈值(ScoreThreshScoreThreshScoreThreshScoreThreshscoreThreshscore_thresh)在各层级应用,最终生成的 DisparityDisparityDisparityDisparitydisparitydisparity 与 ScoreScoreScoreScorescorescore 图像域,由所有单层处理结果的交集域构成。通常而言,当视差图像能被分割为更多均匀视差区域且指定视差范围越大时,金字塔结构的优势越显著。其弊端在于粗层级可能丢失关键纹理信息,导致视差值计算不足。
最后,参数 SubDisparitySubDisparitySubDisparitySubDisparitysubDisparitysub_disparity 的取值
'interpolation'"interpolation""interpolation""interpolation""interpolation""interpolation" 将执行视差值的亚像素级优化。若将该参数设为
'none'"none""none""none""none""none" 则关闭该功能。
执行信息
- 多线程类型:可重入(与非独占算子并行运行)。
- 多线程作用域:全局(可从任何线程调用)。
- 在内部数据级别上自动并行化。
参数
ImageRect1ImageRect1ImageRect1ImageRect1imageRect1image_rect_1 (输入对象) singlechannelimage → objectHImageHObjectHImageHobject (byte)
相机 1 的校正图像。
ImageRect2ImageRect2ImageRect2ImageRect2imageRect2image_rect_2 (输入对象) singlechannelimage → objectHImageHObjectHImageHobject (byte)
相机 2 的校正图像。
DisparityDisparityDisparityDisparitydisparitydisparity (输出对象) singlechannelimage → objectHImageHObjectHImageHobject * (real)
视差图。
ScoreScoreScoreScorescorescore (输出对象) singlechannelimage → objectHImageHObjectHImageHobject * (real)
视差值评估。
MethodMethodMethodMethodmethodmethod (输入控制) string → HTuplestrHTupleHtuple (string) (string) (HString) (char*)
匹配函数。
默认值:
'ncc'
"ncc"
"ncc"
"ncc"
"ncc"
"ncc"
值列表:
'ncc'"ncc""ncc""ncc""ncc""ncc", 'sad'"sad""sad""sad""sad""sad", 'ssd'"ssd""ssd""ssd""ssd""ssd"
MaskWidthMaskWidthMaskWidthMaskWidthmaskWidthmask_width (输入控制) integer → HTupleintHTupleHtuple (integer) (int / long) (Hlong) (Hlong)
相关窗口宽度。
默认值:
11
建议值:
5, 7, 9, 11, 21
限制:
3 <= MaskWidth && odd(MaskWidth)
MaskHeightMaskHeightMaskHeightMaskHeightmaskHeightmask_height (输入控制) integer → HTupleintHTupleHtuple (integer) (int / long) (Hlong) (Hlong)
相关性窗口的高度。
默认值:
11
建议值:
5, 7, 9, 11, 21
限制:
3 <= MaskHeight && odd(MaskHeight)
TextureThreshTextureThreshTextureThreshTextureThreshtextureThreshtexture_thresh (输入控制) real → HTupleUnion[float, int]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)
纹理图像区域的方差阈值。
默认值:
0.0
建议值:
0.0, 10.0, 30.0
限制:
0.0 <= TextureThresh
MinDisparityMinDisparityMinDisparityMinDisparityminDisparitymin_disparity (输入控制) integer → HTupleintHTupleHtuple (integer) (int / long) (Hlong) (Hlong)
预期视差的最小值。
默认值:
-30
值范围:
-32768
≤
MinDisparity
MinDisparity
MinDisparity
MinDisparity
minDisparity
min_disparity
≤
32767
MaxDisparityMaxDisparityMaxDisparityMaxDisparitymaxDisparitymax_disparity (输入控制) integer → HTupleintHTupleHtuple (integer) (int / long) (Hlong) (Hlong)
预期视差的最大值。
默认值:
30
值范围:
-32768
≤
MaxDisparity
MaxDisparity
MaxDisparity
MaxDisparity
maxDisparity
max_disparity
≤
32767
NumLevelsNumLevelsNumLevelsNumLevelsnumLevelsnum_levels (输入控制) integer → HTupleintHTupleHtuple (integer) (int / long) (Hlong) (Hlong)
金字塔层数。
默认值:
1
建议值:
1, 2, 3, 4
限制:
1 <= NumLevels
ScoreThreshScoreThreshScoreThreshScoreThreshscoreThreshscore_thresh (输入控制) real → HTupleUnion[float, int]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)
相关函数的阈值。
默认值:
0.5
建议值:
-1.0, 0.0, 0.3, 0.5, 0.7
FilterFilterFilterFilterfilterfilter (输入控制) string(-array) → HTupleMaybeSequence[str]HTupleHtuple (string) (string) (HString) (char*)
下游滤波器。
默认值:
'none'
"none"
"none"
"none"
"none"
"none"
值列表:
'left_right_check'"left_right_check""left_right_check""left_right_check""left_right_check""left_right_check", 'none'"none""none""none""none""none"
SubDisparitySubDisparitySubDisparitySubDisparitysubDisparitysub_disparity (输入控制) string → HTuplestrHTupleHtuple (string) (string) (HString) (char*)
视差的亚像素插值。
默认值:
'none'
"none"
"none"
"none"
"none"
"none"
值列表:
'interpolation'"interpolation""interpolation""interpolation""interpolation""interpolation", 'none'"none""none""none""none""none"
示例(HDevelop)
* Set internal and external stereo parameters.
* Note that, typically, these values are the result of a prior
* calibration.
gen_cam_par_area_scan_division (0.01, -665, 5.2e-006, 5.2e-006, \
622, 517, 1280, 1024, CamParam1)
gen_cam_par_area_scan_division (0.01, -731, 5.2e-006, 5.2e-006, \
654, 519, 1280, 1024, CamParam2)
create_pose (0.1535,-0.0037,0.0447,0.17,319.84,359.89, \
'Rp+T', 'gba', 'point', RelPose)
* Compute the mapping for rectified images.
gen_binocular_rectification_map (Map1, Map2, CamParam1, CamParam2, RelPose, \
1, 'viewing_direction', 'bilinear', \
CamParamRect1,CamParamRect2, \
Cam1PoseRect1, Cam2PoseRect2,RelPoseRect)
* Compute the disparities in online images.
while (1)
grab_image_async (Image1, AcqHandle1, -1)
map_image (Image1, Map1, ImageRect1)
grab_image_async (Image2, AcqHandle2, -1)
map_image (Image2, Map2, ImageRect2)
binocular_disparity(ImageRect1, ImageRect2, Disparity, Score, 'sad', \
11, 11, 20, -40, 20, 2, 25, 'left_right_check', \
'interpolation')
endwhile
示例(HDevelop)
* Set internal and external stereo parameters.
* Note that, typically, these values are the result of a prior
* calibration.
gen_cam_par_area_scan_division (0.01, -665, 5.2e-006, 5.2e-006, \
622, 517, 1280, 1024, CamParam1)
gen_cam_par_area_scan_division (0.01, -731, 5.2e-006, 5.2e-006, \
654, 519, 1280, 1024, CamParam2)
create_pose (0.1535,-0.0037,0.0447,0.17,319.84,359.89, \
'Rp+T', 'gba', 'point', RelPose)
* Compute the mapping for rectified images.
gen_binocular_rectification_map (Map1, Map2, CamParam1, CamParam2, RelPose, \
1, 'viewing_direction', 'bilinear', \
CamParamRect1,CamParamRect2, \
Cam1PoseRect1, Cam2PoseRect2,RelPoseRect)
* Compute the disparities in online images.
while (1)
grab_image_async (Image1, AcqHandle1, -1)
map_image (Image1, Map1, ImageRect1)
grab_image_async (Image2, AcqHandle2, -1)
map_image (Image2, Map2, ImageRect2)
binocular_disparity(ImageRect1, ImageRect2, Disparity, Score, 'sad', \
11, 11, 20, -40, 20, 2, 25, 'left_right_check', \
'interpolation')
endwhile
示例(HDevelop)
* Set internal and external stereo parameters.
* Note that, typically, these values are the result of a prior
* calibration.
gen_cam_par_area_scan_division (0.01, -665, 5.2e-006, 5.2e-006, \
622, 517, 1280, 1024, CamParam1)
gen_cam_par_area_scan_division (0.01, -731, 5.2e-006, 5.2e-006, \
654, 519, 1280, 1024, CamParam2)
create_pose (0.1535,-0.0037,0.0447,0.17,319.84,359.89, \
'Rp+T', 'gba', 'point', RelPose)
* Compute the mapping for rectified images.
gen_binocular_rectification_map (Map1, Map2, CamParam1, CamParam2, RelPose, \
1, 'viewing_direction', 'bilinear', \
CamParamRect1,CamParamRect2, \
Cam1PoseRect1, Cam2PoseRect2,RelPoseRect)
* Compute the disparities in online images.
while (1)
grab_image_async (Image1, AcqHandle1, -1)
map_image (Image1, Map1, ImageRect1)
grab_image_async (Image2, AcqHandle2, -1)
map_image (Image2, Map2, ImageRect2)
binocular_disparity(ImageRect1, ImageRect2, Disparity, Score, 'sad', \
11, 11, 20, -40, 20, 2, 25, 'left_right_check', \
'interpolation')
endwhile
示例(HDevelop)
* Set internal and external stereo parameters.
* Note that, typically, these values are the result of a prior
* calibration.
gen_cam_par_area_scan_division (0.01, -665, 5.2e-006, 5.2e-006, \
622, 517, 1280, 1024, CamParam1)
gen_cam_par_area_scan_division (0.01, -731, 5.2e-006, 5.2e-006, \
654, 519, 1280, 1024, CamParam2)
create_pose (0.1535,-0.0037,0.0447,0.17,319.84,359.89, \
'Rp+T', 'gba', 'point', RelPose)
* Compute the mapping for rectified images.
gen_binocular_rectification_map (Map1, Map2, CamParam1, CamParam2, RelPose, \
1, 'viewing_direction', 'bilinear', \
CamParamRect1,CamParamRect2, \
Cam1PoseRect1, Cam2PoseRect2,RelPoseRect)
* Compute the disparities in online images.
while (1)
grab_image_async (Image1, AcqHandle1, -1)
map_image (Image1, Map1, ImageRect1)
grab_image_async (Image2, AcqHandle2, -1)
map_image (Image2, Map2, ImageRect2)
binocular_disparity(ImageRect1, ImageRect2, Disparity, Score, 'sad', \
11, 11, 20, -40, 20, 2, 25, 'left_right_check', \
'interpolation')
endwhile
示例(HDevelop)
* Set internal and external stereo parameters.
* Note that, typically, these values are the result of a prior
* calibration.
gen_cam_par_area_scan_division (0.01, -665, 5.2e-006, 5.2e-006, \
622, 517, 1280, 1024, CamParam1)
gen_cam_par_area_scan_division (0.01, -731, 5.2e-006, 5.2e-006, \
654, 519, 1280, 1024, CamParam2)
create_pose (0.1535,-0.0037,0.0447,0.17,319.84,359.89, \
'Rp+T', 'gba', 'point', RelPose)
* Compute the mapping for rectified images.
gen_binocular_rectification_map (Map1, Map2, CamParam1, CamParam2, RelPose, \
1, 'viewing_direction', 'bilinear', \
CamParamRect1,CamParamRect2, \
Cam1PoseRect1, Cam2PoseRect2,RelPoseRect)
* Compute the disparities in online images.
while (1)
grab_image_async (Image1, AcqHandle1, -1)
map_image (Image1, Map1, ImageRect1)
grab_image_async (Image2, AcqHandle2, -1)
map_image (Image2, Map2, ImageRect2)
binocular_disparity(ImageRect1, ImageRect2, Disparity, Score, 'sad', \
11, 11, 20, -40, 20, 2, 25, 'left_right_check', \
'interpolation')
endwhile
结果
binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparityBinocularDisparitybinocular_disparity 在所有参数值正确时返回 2 ( H_MSG_TRUE )。如有必要,则抛出异常。
可能的前趋
map_imagemap_imageMapImageMapImageMapImagemap_image
可能的后继
thresholdthresholdThresholdThresholdThresholdthreshold,
disparity_to_distancedisparity_to_distanceDisparityToDistanceDisparityToDistanceDisparityToDistancedisparity_to_distance,
disparity_image_to_xyzdisparity_image_to_xyzDisparityImageToXyzDisparityImageToXyzDisparityImageToXyzdisparity_image_to_xyz
替代
binocular_disparity_mgbinocular_disparity_mgBinocularDisparityMgBinocularDisparityMgBinocularDisparityMgbinocular_disparity_mg,
binocular_disparity_msbinocular_disparity_msBinocularDisparityMsBinocularDisparityMsBinocularDisparityMsbinocular_disparity_ms,
binocular_distancebinocular_distanceBinocularDistanceBinocularDistanceBinocularDistancebinocular_distance,
binocular_distance_mgbinocular_distance_mgBinocularDistanceMgBinocularDistanceMgBinocularDistanceMgbinocular_distance_mg,
binocular_distance_msbinocular_distance_msBinocularDistanceMsBinocularDistanceMsBinocularDistanceMsbinocular_distance_ms
另见
map_imagemap_imageMapImageMapImageMapImagemap_image,
gen_binocular_rectification_mapgen_binocular_rectification_mapGenBinocularRectificationMapGenBinocularRectificationMapGenBinocularRectificationMapgen_binocular_rectification_map,
binocular_calibrationbinocular_calibrationBinocularCalibrationBinocularCalibrationBinocularCalibrationbinocular_calibration
模块
三维计量