图像拼接问题:OpenCV SeamFinder返回斑驳无效掩码
OpenCV SeamFinder 掩码无效问题排查
场景与实现逻辑
- 部署6台水平/垂直视场角均为60°的相机,以同一中心向外排布,水平旋转间隔30°
- 将图像投影到以相机为中心的球面上(示意图:简化相机布局示意图,从球面顶部视角)
- 参照OpenCV图像拼接流程开发,因已知相机朝向,跳过**配准(registration)**步骤,暂未加入图像融合环节(示意图:OpenCV图像拼接流程示意图)
问题现象
- 仿真中使用
NoSeamfinder时结果正常,但切换为OpenCV提供的其他SeamFinder(如示例中的GraphCutSeamFinder)后,返回的掩码完全无效(示意图:SeamFinder结果) - 曾怀疑仿真图像梯度过于锐利导致问题,尝试高斯模糊处理,无任何改善
- 参考OpenCV的
stitching_detailed.cpp示例搭建流程,无法定位问题根源
关键代码片段
使用cv::Mat存储图像,转换为cv::UMat供SeamFinder调用:
std::vector<cv::Mat> warped_images_mat; // 投影到球面后的单帧图像 std::vector<cv::UMat> warped_images_umat; std::vector<cv::Mat> warped_masks_mat; // 球面图像中各单帧图像的掩码 std::vector<cv::UMat> warped_masks_umat; std::vector<cv::Mat> warped_masks_fixed_mat; // 预计算的固定掩码,用于刷新SeamFinder的输入掩码 std::vector<cv::UMat> warped_masks_fixed_umat; std::vector<cv::Point> corners; // 各图像/掩码在球面图像中的位置 cv::Ptr<cv::detail::SeamFinder> seam_finder = cv::makePtr<cv::detail::GraphCutSeamFinder>(cv::detail::GraphCutSeamFinderBase::COST_COLOR_GRAD); // ROS2回调函数内逻辑: this->warped_masks_umat.clear(); // 清空旧掩码 for(size_t cam_idx = 0; cam_idx < 6; cam_idx++){ int cols = this->warped_images_mat.at(cam_idx).cols; int rows = this->warped_images_mat.at(cam_idx).rows; // std::cout << "rows: " << rows << "; cols: " << cols << std::endl; for (int col = 0; col < cols; col++) for (int row = 0; row < rows; row++) if (this->warped_masks_fixed_mat.at(cam_idx).at<u_char>(row, col) != 0) // 刷新投影图像的代码 this->warped_images_mat.at(cam_idx).getUMat(cv::ACCESS_RW).convertTo(this->warped_images_umat.at(cam_idx), CV_32F); this->warped_masks_umat.push_back(this->warped_masks_fixed_umat.at(cam_idx).clone()); } seam_finder->find(this->warped_images_umat, this->corners, this->warped_masks_umat);
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

