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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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
Python openCV多边形检测_Python_Opencv_Hough Transform - Fatal编程技术网

Python openCV多边形检测

Python openCV多边形检测,python,opencv,hough-transform,Python,Opencv,Hough Transform,我应该写一个程序来处理这种类型的图像: (所有图像都是这种格式:绿色矩形和蓝色圆圈)。圆圈代表数字的二进制表示。任务是在检测到圆后输出十进制数 我的方法是首先找到绿色矩形(我没有使用颜色掩蔽,原因在后面解释)并获得其宽度和高度 接下来,我根据对称性推断,圆心必须位于距离矩形左边缘w/8,3w/8,5w/8和7w/8的距离处。(水平) 因此,我使用了HoughCircles()方法,然后尝试以(2x-1)w/8的形式表示中心的x坐标。 显然,每个圆的十进制等价物由exp=2^(4-x)给出。因此

我应该写一个程序来处理这种类型的图像:

(所有图像都是这种格式:绿色矩形和蓝色圆圈)。圆圈代表数字的二进制表示。任务是在检测到圆后输出十进制数

我的方法是首先找到绿色矩形(我没有使用颜色掩蔽,原因在后面解释)并获得其宽度和高度

接下来,我根据对称性推断,圆心必须位于距离矩形左边缘
w/8,3w/8,5w/8
7w/8
的距离处。(水平)

因此,我使用了
HoughCircles()
方法,然后尝试以
(2x-1)w/8
的形式表示中心的x坐标。 显然,每个圆的十进制等价物由
exp=2^(4-x)给出。
因此,我使用
n+=2**exp
获得十进制表示

我使用矩形的坐标来近似HoughCircles()方法的适当minRadius和maxRadius值,以便不检测不必要的圆

import numpy as np
import cv2 as cv

img = cv.imread("7.jpeg")

img_height,img_w,c=img.shape


n=0 #stores the decimal rep.

width=0 #dimensions of the rectangle
height=0

start_x=0 #starting coordinates of the rectangle
start_y=0
end_x=0 #ending '''''''
end_y=0
     
minr=0 #for the houghCircles() method
maxr=0
mind=0

output = img.copy()
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)


_, th = cv.threshold(gray, 240, 255, cv.THRESH_BINARY)
contours, _ = cv.findContours(th, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)

for contour in contours:
    approx = cv.approxPolyDP(contour, 0.01* cv.arcLength(contour, True), True)
    
    cv.drawContours(img, [approx], 0, (0, 0, 0), 5)
    x = approx.ravel()[0]
    y = approx.ravel()[1] 

    
    if len(approx) == 4 and x>15 :
        
        
        x1 ,y1, w, h = cv.boundingRect(approx)
        aspectRatio = float(w)/h
        if aspectRatio <= 0.95 or aspectRatio >= 1.05:

          
          width=w
          height=h
          start_x=x1
          start_y=y1
          end_x=start_x+width
          end_y=start_y+height
          cv.rectangle(output, (start_x,start_y), (end_x,end_y), (0,0,255),3)
          cv.putText(output, "rectangle "+str(x)+" , " +str(y-5), (x, y-5), cv.FONT_HERSHEY_COMPLEX, 0.5, (0, 0, 0))
          

minr=int(17*width/192)
maxr=int(7*width/64)
mind=int(width//5)


print("start",start_x,start_y)
print("width",width)
print("height",height)
print("minr", minr)
print("maxr",maxr)
print("mind",mind)

gray = cv.medianBlur(gray, 5)
circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, 1, mind,param1=50, param2=30, minRadius=minr, maxRadius=maxr)

detected_circles = np.uint16(np.around(circles))

for (x, y ,r) in detected_circles[0, :]:
    if(y>start_y and x>start_x):
        
        print("center ", x,y)
        idx= int (((x-start_x)*8)//width) 
        exp=int(4- (0.5* (idx+1)))
        n+= 2**exp
        cv.circle(output, (x, y), r, (0, 0, 0), 3)
        cv.circle(output, (x, y), 2, (0, 255, 255), 3)
print(n)
cv.imshow('output',output)
cv.waitKey(0)
cv.destroyAllWindows()
将numpy导入为np
将cv2作为cv导入
img=cv.imread(“7.jpeg”)
img_高度,img_w,c=img.shape
n=0#存储十进制代表。
宽度=0#矩形的尺寸
高度=0
start_x=0#矩形的起始坐标
起始值y=0
结束x=0结束
结束y=0
minr=0#对于houghCircles()方法
maxr=0
思维=0
输出=img.copy()
灰色=cv.CVT颜色(img,cv.COLOR\u bgr2灰色)
_,th=cv.阈值(灰色,240,255,cv.阈值\u二进制)
等高线,等高线=等高线(等高线、等高线树、等高线链
对于等高线中的等高线:
近似=等高线近似多边形(等高线,0.01*等高线弧长(等高线,真),真)
等高线图(img,[近似值]、0、(0,0,0)、5)
x=大约拉威尔()[0]
y=大约拉威尔()[1]
如果len(近似值)=4且x>15:
x1,y1,w,h=cv.boundingRect(近似值)
aspectRatio=浮动(w)/h
如果aspectRatio=1.05:
宽度=w
高度=h
开始x=x1
起始值y=y1
end_x=start_x+宽度
结束时间=开始时间+高度
cv.矩形(输出,(开始x,开始y),(结束x,结束y),(0,0255),3)
cv.putText(输出,“矩形”+str(x)+“,“+str(y-5),(x,y-5),cv.FONT\u HERSHEY\u COMPLEX,0.5,(0,0,0))
minr=int(17*宽度/192)
maxr=int(7*width/64)
mind=int(宽度//5)
打印(“开始”,开始x,开始y)
打印(“宽度”,宽度)
打印(“高度”,高度)
打印(“minr”,minr)
打印(“maxr”,maxr)
印刷品(“头脑”,头脑)
灰色=等速中间模糊(灰色,5)
圆=cv.HOUGH圆(灰色,cv.HOUGH_渐变,1,注意,参数1=50,参数2=30,最小半径=minr,最大半径=maxr)
检测到的_圆=np.uint16(np.around(圆))
对于检测到的_圆[0,:]中的(x,y,r):
如果(y>开始y和x>开始x):
打印(“中心”,x,y)
idx=int(((x-start_x)*8)//宽度)
exp=int(4-(0.5*(idx+1)))
n+=2**exp
等速圆(输出,(x,y),r,(0,0,0),3)
等速圆(输出,(x,y),2,(0,255,255),3)
打印(n)
cv.imshow('输出',输出)
cv.waitKey(0)
cv.destroyAllWindows()
对于这种类型的所有图像,这都非常有效。但是,有一个小小的缺点:

测试图像的格式非常“好”:所有图像的宽度和高度都是固定的,所有图像都是完全垂直的,每个图像中矩形和圆形的所有颜色在所有图像中都是完全相同的阴影,等等

然而,我们应该使代码更一般一些:为了适应“不太好”的图像。例如,此样式的图像:

基本上是相同的格式,但背景照明+支架不是完全直立的,这让我觉得概括代码稍微有点困难。这就是为什么我不使用HSV颜色掩蔽,因为不会有一组适合所有图像的高值和低值

然而,我尝试做的也是失败的:它无法正确地检测矩形。我希望它能检测多个矩形,但它在那些根本没有矩形的位置检测矩形(而不是在有矩形的位置)


如何调整代码使其更通用,以便正确处理第二类图像?

完全丢弃HoughCircles。这里没用。不要使用它。你有一个长方形。你知道圆圈在固定的位置。对这些位置进行采样(取子区域,计算平均颜色),并确定它是蓝色还是绿色(同时对矩形本身进行采样以进行基线绿色测量!)使用cv2.inRange在蓝色上设置阈值。然后得到轮廓线。如果需要,测试是否循环。然后使用cv2.MineConclosingCircle获得中心和半径,并根据需要进行测试。为什么需要找到绿色矩形?如果是这样的话,请将阈值设置为绿色以找到绿色,然后在矩形内裁剪矩形并再次将阈值设置为蓝色。您知道生成aruco标记的字典吗?OpenCV的aruco检测速度快且最可靠。我们可以用它来检查四个圆圈的相对位置,看看这些斑点是否大部分是蓝色的。