Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 在图像中查找扭曲的矩形(OpenCV)_Image Processing_Opencv_Camera Calibration - Fatal编程技术网

Image processing 在图像中查找扭曲的矩形(OpenCV)

Image processing 在图像中查找扭曲的矩形(OpenCV),image-processing,opencv,camera-calibration,Image Processing,Opencv,Camera Calibration,我正在寻找一套正确的算法来解决这个图像处理问题: 我有一个扭曲的二值图像,其中包含一个扭曲的矩形 我需要找到这个矩形的4个角点的一个很好的近似值 我可以使用OpenCV计算轮廓,但由于图像扭曲,它通常包含4个以上的角点。 是否有一个好的近似算法(最好使用OpenCV操作)来使用二值图像或轮廓描述查找矩形角点 图像如下所示: 谢谢 丹尼斯我会尝试广义霍夫变换,它有点慢,但能很好地处理扭曲/不完整的形状 查看opencv函数ApproxPoly。它从轮廓近似多边形。使用函数消除轮廓的节点数,然

我正在寻找一套正确的算法来解决这个图像处理问题:

  • 我有一个扭曲的二值图像,其中包含一个扭曲的矩形
  • 我需要找到这个矩形的4个角点的一个很好的近似值
我可以使用OpenCV计算轮廓,但由于图像扭曲,它通常包含4个以上的角点。 是否有一个好的近似算法(最好使用OpenCV操作)来使用二值图像或轮廓描述查找矩形角点

图像如下所示:

谢谢


丹尼斯

我会尝试广义霍夫变换,它有点慢,但能很好地处理扭曲/不完整的形状


查看opencv函数ApproxPoly。它从轮廓近似多边形。

使用函数消除轮廓的节点数,然后过滤掉节点过多或角度相差90度的轮廓。另请参见尝试Harris角点检测器。OpenCV包中有一个示例。为了你的形象,你需要使用params


请参阅其他OpenCV算法:

答案略有不同,请参阅

  • 即使您开始时有一些缺陷,例如approxPolly调用返回pent/hexagons,这也会起作用。它将减少任何轮廓,例如,横切轮廓,成为四边形,或任何你想要的多边形
  • vector cardPoly;//四元存储器
    int多段线=0//多聚物计数器;)
    双重简单性=0.5//调整的增量,较低的数字可能更精确,而较高的数字循环更快。
    while(多段线!=4)//调整此值
    {
    approxPolyDP(transContours、Poly、Simply、true);
    多段线=Poly.size();
    简单性+=0.5;
    }
    

  • 像往常一样,对于这样的问题,示例图像会非常有用。我添加了一个图像,希望这将有助于找到解决方案。断开的链接:((8年后不足为奇…))
    vector<Point> cardPoly;// Quad storage
    int PolyLines = 0;//PolyPoly counter ;)
    double simplicity = 0.5;//Increment of adjustment, lower numbers may be more precise vs. high numbers being faster to cycle.
    while(PolyLines != 4)//Adjust this 
    {
        approxPolyDP(transContours, Poly, simplicity, true);
        PolyLines = Poly.size();
        simplicity += 0.5;
    }