python opencv 识别圆角矩形_OpenCV-如何找到圆角矩形的矩形轮廓?

1586010002-jmsa.png

I'm trying to find the contour of a rectangle object with round corner in a image. I tried HoughLinesP and findContours, but did not achieve the desired result.

NoaKT.png

I want to find the rectangle like this:

Ys6f3.png

Code:

import cv2

import matplotlib.pyplot as plt

import util

image = cv2.imread("./img/findrect0.png", 1)

gray = util.grayImage(image)

edges = cv2.Canny(image, 50, 200)

lines = cv2.HoughLinesP(edges, 1, cv2.cv.CV_PI/180, 50, minLineLength=50, maxLineGap=10)[0]

linesImage = image.copy()

util.drawLines(linesImage, lines, thickness=10)

contoursImage = image.copy()

(contours, hierarchy) = cv2.findContours(gray.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

util.drawContours(contoursImage, contours, thickness=10)

util.showOpenCVImagesGrid([image, edges, linesImage, contoursImage], 2, 2, titles=["original image", "canny image", "lines image", "contours image"])

util:

import cv2

import math

import matplotlib.pyplot as plt

def showOpenCVImagesGrid(images, x, y, titles=None, axis="on"):

fig = plt.figure()

i = 1

for image in images:

copy = image.copy()

channel = len(copy.shape)

cmap = None

if channel == 2:

cmap = "gray"

elif channel == 3:

copy = cv2.cvtColor(copy, cv2.COLOR_BGR2RGB)

elif channel == 4:

copy = cv2.cvtColor(copy, cv2.COLOR_BGRA2RGBA)

fig.add_subplot(x, y, i)

if titles is not None:

plt.title(titles[i-1])

plt.axis(axis)

plt.imshow(copy, cmap=cmap)

i += 1

plt.show()

def grayImage(image):

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

return gray

def drawLines(image, lines, thickness=1):

for line in lines:

# print("line="+str(line))

cv2.line(image, (line[0], line[1]), (line[2], line[3]),

(0, 0, 255), thickness)

def drawContours(image, contours, thickness=1):

i = 0

for contour in contours:

cv2.drawContours(image, [contours[i]], i, (0, 255, 0), thickness)

area = cv2.contourArea(contour)

i += 1

I'm using Python 2.7.13 and OpenCV 2.4.13.3.

I've been thinking to extend these lines and get intersection points of lines. Finally, I will get four coordinates of rectangle.

But if the image is more complex, I don't know how to deal with.

解决方案

You need to find the bounding rectangle of the found contours.

img = cv2.imread("image.png", -1)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

binary = cv2.bitwise_not(gray)

(_,contours,_) = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

for contour in contours:

(x,y,w,h) = cv2.boundingRect(contour)

cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)

KNV39.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值