如何使用OpenCV检测简单的几何图形

如何使用OpenCV检测简单的几何图形,opencv,Opencv,我有这个项目,我需要(在iOS上)检测图像中的简单几何形状 在搜索了互联网后,我得出结论,这方面最好的工具是OpenCV。问题是,直到两个小时前,我还不知道什么是OpenCV,我甚至从未远程做过任何涉及图像处理的事情。我的主要经验是JS/HTML、C#、SQL、Objective-C 从哪里开始呢 我发现这是我能够理解的,通过阅读其他内容,我理解OpenCV应该返回一个带有点/角的形状数组,这是真的吗?它将如何表示一个圆或半个圆? 还有形状方向呢 您知道有任何演示iOS项目可以演示类似的功能吗

我有这个项目,我需要(在iOS上)检测图像中的简单几何形状

在搜索了互联网后,我得出结论,这方面最好的工具是OpenCV。问题是,直到两个小时前,我还不知道什么是OpenCV,我甚至从未远程做过任何涉及图像处理的事情。我的主要经验是JS/HTML、C#、SQL、Objective-C

从哪里开始呢

我发现这是我能够理解的,通过阅读其他内容,我理解OpenCV应该返回一个带有点/角的形状数组,这是真的吗?它将如何表示一个圆或半个圆? 还有形状方向呢


您知道有任何演示iOS项目可以演示类似的功能吗

如果只有这些规则形状,有一个简单的步骤如下:

  • 在图像中查找轮廓(图像应为问题中给出的二进制图像)
  • 使用
    approxPolyDP
    函数近似每个轮廓
  • 首先,检查所有形状的近似轮廓中的元素数量。这是为了识别形状。例如,正方形有4个,五角大楼有5个。圆圈会有更多,我不知道,所以我们找到了。(我打圈得16分,打半圈得9分。)
  • 现在分配颜色,运行测试图像的代码,检查其编号,用相应的颜色填充
  • 下面是我在Python中的示例:

    import numpy as np
    import cv2
    
    img = cv2.imread('shapes.png')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    ret,thresh = cv2.threshold(gray,127,255,1)
    
    contours,h = cv2.findContours(thresh,1,2)
    
    for cnt in contours:
        approx = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),True)
        print len(approx)
        if len(approx)==5:
            print "pentagon"
            cv2.drawContours(img,[cnt],0,255,-1)
        elif len(approx)==3:
            print "triangle"
            cv2.drawContours(img,[cnt],0,(0,255,0),-1)
        elif len(approx)==4:
            print "square"
            cv2.drawContours(img,[cnt],0,(0,0,255),-1)
        elif len(approx) == 9:
            print "half-circle"
            cv2.drawContours(img,[cnt],0,(255,255,0),-1)
        elif len(approx) > 15:
            print "circle"
            cv2.drawContours(img,[cnt],0,(0,255,255),-1)
    
    cv2.imshow('img',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    以下是输出:

    记住,它只适用于规则形状

    或者,要查找圆,可以使用
    houghcircles
    。你可以找到一份工作

    关于iOS,OpenCV开发者今年夏天正在开发一些iOS示例,因此请访问他们的网站:www.code.OpenCV.org并与他们联系


    你可以在这里找到他们教程的幻灯片:

    你也可以用它来检测图像中的形状

    答案取决于其他形状的存在、噪声水平(如果有)以及您想要提供的不变性(例如旋转、缩放等)。这些要求不仅定义了算法,还定义了提取特征所需的预处理阶段

    当形状没有旋转或缩放,并且周围没有类似形状时,上述建议效果良好;换句话说,它会在模板所在的图像中找到最佳翻译:

    double minVal, maxVal;
    Point minLoc, maxLoc;
    Mat image, template, result; // template is your shape
    matchTemplate(image, template, result, CV_TM_CCOEFF_NORMED);
    minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc); // maxLoc is answer
    
    是获得旋转和缩放不变性的好方法;这种方法需要提取一些轮廓点

    变换可以处理不变性、噪声和最小的预处理,但它比其他方法更难实现。OpenCV对直线和圆有这样的变换


    在形状数量有限的情况下,计算力矩或计算凸包顶点可能是最简单的解决方案:

    您是否只有这些规则形状?还是其他不规则形状?谢谢你的回答,再澄清一次。如何检测形状方向?你所说的形状方向是什么意思。例如,假设没有其他形状。检测通常意味着在其他事物中发现一些东西。所以,如果有矩形和正方形,你就不会区分它们。第二,即使是一点点噪音也会使顶点计数方法出错。+1-Vlad,你所有的点都是正确的。但在这里,请看问题,他是新来的,所以他需要一些东西开始,所以我的答案是非常基本的。这就是为什么我在第一句中明确提到“如果所有形状都是规则的”。OP没有问正方形和长方形,所以我没有碰那个部分。我喜欢“问题的答案”,而不是提供他没有问过的所有信息。让他自己去发现并解决它。如果他不能,让他再来问具体的问题。为了在Python 3中实现这一点,需要在第6行添加一个变量:img2,轮廓,h=cv2。findContours(thresh,1,2),只有当你确切知道你的形状会是什么样子时才可以。如果你有不同大小的正方形,例如放大/缩小,我认为这种方法不会很好地工作。这个链接唯一的答案是不合适的。