import cv2
import numpy as np
from numpy.ma.testutils import approx
if __name__ == '__main__':
img = cv2.imread('./image/car2.jpg')
# img = cv2.resize(img, (img.shape[1] // 4, img.shape[0] // 4))
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gaussian_blue = cv2.GaussianBlur(gray,(3,3),sigmaX=0)
# #算出其轮廓
canny = cv2.Canny(gaussian_blue,300,400)
#
#
# #二值化操作
ret,binary = cv2.threshold(canny,127,255,cv2.THRESH_BINARY)
cv2.imshow('binary', binary)
#
#形态学操作,为了获取一个大块儿的矩形
dilate = cv2.dilate(binary,np.ones(shape=[10,10],dtype=np.uint8))
cv2.imshow('dilate', dilate)
kernel = np.ones((5,5),np.uint8)
erode = cv2.erode(dilate, kernel=kernel, iterations=1)
cv2.imshow('erode', erode)
# close_img = cv2.morphologyEx(binary,cv2.MORPH_CLOSE,kernel)
# cv2.imshow('close', close_img)
# open_img = cv2.morphologyEx(close_img,cv2.MORPH_OPEN,kernel)
# cv2.imshow('open', open_img)
List,hierarchy = cv2.findContours(erode,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
List = sorted(List,key=cv2.contourArea,reverse=True)[:30]
car_pai = None
for c in List:
peri = cv2.arcLength(c,True) #获取轮廓周长
approx = cv2.approxPolyDP(c,0.01 * peri,True) #将轮廓转变为一个近似的多边形
if len(approx) == 4:
car_pai = approx
break
cv2.drawContours(img,[car_pai],-1,(0,255,0),3)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
实现效果如下图: