python - 形状分析以区分矩形与其他形状

标签 python opencv contour shapes rectangles

我一直在尝试使用二值图像进行形状分析以区分矩形对象和非矩形对象(例如半圆形)

一些可能的示例

矩形

enter image description here enter image description here

非矩形

enter image description here enter image description here

我的算法工作原理如下:

  1. 使用轮廓提取对象蒙版 - openCV(如上面的示例所示)
  2. 执行形状分析或计算统计数据以检测对象是否为矩形

到目前为止,我已经尝试过偏心率和矩形测量。

例如:理想情况下,矩形度应仅对于矩形而言较高。在我的实验中,有时我会得到矩形或圆形物体的类似矩形。因此,我不能使用这个度量进行分析,因为它不可靠

偏心也会发生同样的问题。理想情况下,圆形的偏心率为零,对于矩形物体,偏心率应该非常高。但事实证明,矩形或圆形非常相似

有没有办法判断对象是否大致是一个矩形或者不使用任何几何信息??

任何帮助将不胜感激

最佳答案

我认为你可以使用approxPolyDP 。我给你 C++ 程序,我认为用 python 翻译很容易。想法是寻找具有四个角的近似真实轮廓的形状,然后计算四个角度(角角)。当轮廓点数量大于4时,新轮廓与真实轮廓之间的误差增大。 当您认为它不是矩形时,您必须选择一个阈值角度(90+/- x°)。 (抱歉英语不好)

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;


int main(int argc, char **argv)
{
vector<String> fileName;
fileName.push_back("2nrTo.jpg");
fileName.push_back("G3I4t.jpg");
fileName.push_back("Q4ZtM.jpg");
fileName.push_back("vWgKx.jpg");
for (int i = 0; i < static_cast<int>(fileName.size()); i++)
{
    Mat mThresh;
    Mat m=imread(fileName[i],CV_LOAD_IMAGE_GRAYSCALE);
    Mat mc;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    threshold(m,mThresh,80,255,THRESH_BINARY);
    findContours(mThresh,contours,hierarchy, cv::RETR_CCOMP, cv::CHAIN_APPROX_NONE, cv::Point(0,0));
    cout << "Image " << fileName[i] << "\n";
    imshow(fileName[i],m);
    mc = Mat::zeros(m.size(),CV_8UC3);
    drawContours(mc,contours,0,Scalar(255,0,0),1);
    vector<Point> approx;
    double d=0;
    do
    {
        d=d+1;
        approxPolyDP(contours[0],approx,d,true);
    }
    while (approx.size()>4);
    cout << "#vertices =" <<approx.size() << "\t error max= " <<d<<endl;
    if (approx.size() == 4)
    {
        cout << "Angles\n";
        Point2d u(approx[1]-approx[0]),v(approx[2]-approx[1]),w(approx[3]-approx[2]),x(approx[3]-approx[0]);
        cout<<acos(u.dot(v) / norm(u) / norm(v))<<"\n";
        cout<<acos(v.dot(w) / norm(v) / norm(w))<<"\n";
        cout<<acos(w.dot(x) / norm(w) / norm(x))<<"\n";
        cout<<acos(x.dot(u) / norm(x) / norm(u))<<"\n";

    }
    else
        cout << "looks like a triangle\n";
    contours.push_back(approx);
    drawContours(mc,contours,contours.size()-1,Scalar(0,0,255),1);
    imshow("Ctr",mc);
    waitKey();
}

return 0;
}

使用以前的图像程序给出这些结果:

Image 2nrTo.jpg
#vertices =4     error max= 17
Angles
93.3283
90.2247
90
93.553
Image G3I4t.jpg
#vertices =4     error max= 15
Angles
112.503
46.3837
110.346
48.5412
Image Q4ZtM.jpg
#vertices =4     error max= 6
Angles
88.9191
90.0297
88.9488
90
Image vWgKx.jpg
#vertices =4     error max= 49
Angles
87.0753
117.999
90.3148
114.76

关于python - 形状分析以区分矩形与其他形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36926923/

相关文章:

python - 创建带有编号时间窗口的新数据框列

python - openssl,python请求错误: "certificate verify failed"

c++ - cmake opencv : Parse error in command line argument: -D 错误

c++ - OpenCV : How to find the pixels inside a contour in c++

contour - 从三角形网格和平面的相交创建轮廓

python - 给定一组 3D 点及其相应温度的数组,如何绘制横截面的等高线图?

python - Python变量是指针吗?否则,它们是什么?

python - 如何获取特定时间范围的平均值

c++ - 设计这个简单的 ReactNative AR 应用程序的最佳方法是什么?

opencv - 如何在opencv-android中设置ORB特征检测器参数