【问题标题】:getting ROI in OpenCV在 OpenCV 中获得 ROI
【发布时间】:2013-06-06 00:52:59
【问题描述】:

我正在使用 OpenCV,我的项目的一部分是 3d 校准,我正在使用 OpenCV 的 cv::findChessboardCorners 功能进行这项工作,效果很好。我的问题是我需要根据找到的棋盘部分裁剪图像。假设我的棋盘角找到的点是 (boardSize( 2*3 )) :

     [384.87457, 275.93411; 402.59073, 305.37384; 420.99899, 335.61783; 366.1167, 277.35107; 
      384.15289, 308.0141; 402.59592, 339.44702; 346.16739, 279.11893; 364.19324, 310.56906;  
      383.36844, 343.98239; 324.71078, 281.3793; 343.24969, 313.93167;362.28644, 348.54108]

这是我的代码的一部分,它给了我角落的位置:

  if( (cv::findChessboardCorners(img,boardSize, imageCorners))){
    cv::drawChessboardCorners(img,boardSize,imageCorners,true);
    std::cout<<imageCorners[0] <<std::endl;
    std::cout<<imageCorners[((boardSize.height)*(boardSize.width))-1] <<std::endl;
    std::cout << imageCorners << std::endl;
    cv::Rect  myroi (imageCorners[0],imageCorners[((boardSize.height)*(boardSize.width))-1]);
    cv::imshow("Part ", img(myroi));

}

问题是我只得到了我感兴趣区域的一个矩形。

正如您在上面看到的,蓝色区域是我感兴趣的区域,但红色矩形是我得到的。我该如何解决这个问题?

【问题讨论】:

    标签: c++ opencv image-processing


    【解决方案1】:

    你有扭曲棋盘的 4 个角的坐标。使用这些来找到形成四边形的 4 条线的方程。对于任何给定点,您将能够检查它是否位于顶线和底线之间在左右线之间。如果是,则在遮罩图像上将其标记为 1,否则标记为 0。使用遮罩图像将失真区域切掉。

    【讨论】:

      【解决方案2】:

      因此,您想从外部棋盘角裁剪图像。您需要找到顶点列表的 MinX、MaxX、MinY 和 MaxY 以获得最小的边界 ROI(感兴趣的矩形)。

      所以你的答案很简单:

      TopLeft = (MinX, MinY)
      BotRight = (MaxX, MaxY)
      
      ROI = (TopLeft, BotRight)
      

      【讨论】:

      • 我认为他需要平行四边形,而不是边界矩形。所以他需要一个转换后的矩形作为 ROI。
      猜你喜欢
      • 2021-11-30
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      相关资源
      最近更新 更多