Hi
I want to do a twice stereo matching process. The input are the same(left rectified image and right rectified image), but the output are not(calculate left to right disparity and right to left disparity).
After look into this forums, there is a way to do this. One way is to create two different graph, and each graph to deal with there own stereo matching. But after I finished my code. The result is the same as one graph to do twice stereo matching, following are the code.
SGBM::SGBM(vx_context context, const StereoMatchingParams& params,
const StereoCalibParams& calib_params,
vx_image left, vx_image right, vx_image left_disparity, vx_image right_disparity)
: main_graph_(nullptr)
{
vx_df_image format = VX_DF_IMAGE_VIRT;
vx_uint32 width = 0;
vx_uint32 height = 0;
r_graph_ = nullptr;
NVXIO_SAFE_CALL( vxQueryImage(left, VX_IMAGE_ATTRIBUTE_FORMAT, &format, sizeof(format)) );
NVXIO_SAFE_CALL( vxQueryImage(left, VX_IMAGE_ATTRIBUTE_WIDTH, &width, sizeof(width)) );
NVXIO_SAFE_CALL( vxQueryImage(left, VX_IMAGE_ATTRIBUTE_HEIGHT, &height, sizeof(height)) );
main_graph_ = vxCreateGraph(context);
r_graph_ = vxCreateGraph(context);
NVXIO_CHECK_REFERENCE(main_graph_);
NVXIO_CHECK_REFERENCE(r_graph_);
// left stereo
vx_image disparity_short = vxCreateVirtualImage(main_graph_, width, height, VX_DF_IMAGE_S16);
NVXIO_CHECK_REFERENCE(disparity_short);
semi_global_matching_node_ = nvxSemiGlobalMatchingNode(
main_graph_,
left,
right,
disparity_short,
params.min_disparity,
params.max_disparity,
params.P1,
params.P2,
params.sad,
params.ct_win_size,
params.hc_win_size,
params.bt_clip_value,
params.max_diff,
params.uniqueness_ratio,
params.scanlines_mask,
params.flags);
NVXIO_CHECK_REFERENCE(semi_global_matching_node_);
vx_int32 shift = 4;
vx_scalar s_shift = vxCreateScalar(context, VX_TYPE_INT32, &shift);
NVXIO_CHECK_REFERENCE(s_shift);
convert_depth_node_ = vxConvertDepthNode(main_graph_, disparity_short, left_disparity, VX_CONVERT_POLICY_SATURATE, s_shift);
NVXIO_CHECK_REFERENCE(convert_depth_node_);
// right stereo
vx_image r_disparity_short = vxCreateVirtualImage(r_graph_, width, height, VX_DF_IMAGE_S16);
NVXIO_CHECK_REFERENCE(r_disparity_short);
vx_image flip_left_gray = vxCreateVirtualImage(r_graph_, width, height, VX_DF_IMAGE_U8);
NVXIO_CHECK_REFERENCE(flip_left_gray);
vx_image flip_right_gray = vxCreateVirtualImage(r_graph_, width, height, VX_DF_IMAGE_U8);
NVXIO_CHECK_REFERENCE(flip_right_gray);
left_flip_node_ = nvxFlipImageNode(r_graph_, left, flip_left_gray, NVX_FLIP_HORIZONTAL);
NVXIO_CHECK_REFERENCE(left_flip_node_);
right_flip_node_ = nvxFlipImageNode(r_graph_, right, flip_right_gray, NVX_FLIP_HORIZONTAL);
NVXIO_CHECK_REFERENCE(right_flip_node_);
vx_image flip_disparity = vxCreateVirtualImage(r_graph_, width, height, VX_DF_IMAGE_U8);
NVXIO_CHECK_REFERENCE(flip_disparity);
r_semi_global_matching_node_ = nvxSemiGlobalMatchingNode(
r_graph_,
flip_right_gray,
flip_left_gray,
r_disparity_short,
params.min_disparity,
params.max_disparity,
params.P1,
params.P2,
params.sad,
params.ct_win_size,
params.hc_win_size,
params.bt_clip_value,
params.max_diff,
params.uniqueness_ratio,
params.scanlines_mask,
params.flags);
NVXIO_CHECK_REFERENCE(r_semi_global_matching_node_);
// convert disparity from fixed point to grayscale
r_convert_depth_node_ = vxConvertDepthNode(r_graph_, r_disparity_short, flip_disparity, VX_CONVERT_POLICY_SATURATE, s_shift);
NVXIO_CHECK_REFERENCE(r_convert_depth_node_);
vxReleaseScalar(&s_shift);
flip_depth_node_ = nvxFlipImageNode(r_graph_, flip_disparity, right_disparity, NVX_FLIP_HORIZONTAL);
NVXIO_CHECK_REFERENCE(flip_depth_node_);
// verify the graph
NVXIO_SAFE_CALL( vxVerifyGraph(main_graph_) );
NVXIO_SAFE_CALL( vxVerifyGraph(r_graph_) );
// clean up
vxReleaseImage(&disparity_short);
vxReleaseImage(&flip_disparity);
vxReleaseImage(&flip_left_gray);
vxReleaseImage(&flip_right_gray);
vxReleaseImage(&r_disparity_short);
}
I had defined "r_graph_" in class SGBM.
class SGBM : public StereoMatching
{
public:
SGBM(vx_context context, const StereoMatchingParams& params,
const StereoCalibParams& calibParams,
vx_image left, vx_image right, vx_image left_disparity, vx_image right_disparity);
~SGBM();
virtual void run();
void printPerfs() const;
private:
vx_graph main_graph_;
vx_graph r_graph_;
vx_node left_flip_node_;
vx_node right_flip_node_;
vx_node flip_depth_node_;
vx_node left_cvt_color_node_;
vx_node right_cvt_color_node_;
vx_node left_remap_node_;
vx_node right_remap_node_;
vx_node semi_global_matching_node_;
vx_node r_semi_global_matching_node_;
vx_node convert_depth_node_;
vx_node r_convert_depth_node_;
};
The result did not have any difference then in only one graph. Especially the time consuming are much the same.
Maybe I had missed something when coding, please help me figure this out.
Thanks.
BR.