4,269
社区成员




import cv2 as cv
import numpy as np
import math
def findColor(src, min, max):
'''
描述:用于判断颜色识别基于HSV模式
:param src:
:param min:
:param max:
:return:
'''
src_image = cv.GaussianBlur(src, (9, 9), 0)
hsv_image = cv.cvtColor(src_image, cv.COLOR_BGR2HSV)
thresholded = cv.inRange(hsv_image, (min, 90, 90), (max, 255, 255))
return thresholded
def angle(pt1, pt2, pt0):
'''
描述:用于求证正方形
:param pt1:
:param pt2:
:param pt0:
:return:
'''
dx1 = pt1[0][0] - pt0[0][0]
dy1 = pt1[0][1] - pt0[0][1]
dx2 = pt2[0][0] - pt0[0][0]
dy2 = pt2[0][1] - pt0[0][1]
# 边长平方的比
ratio = (dx1 * dx1 + dy1 * dy1) / (dx2 * dx2 + dy2 * dy2)
a = (dx1 * dx2 + dy1 * dy2) / math.sqrt((dx1 * dx1 + dy1 * dy1) * (dx2 * dx2 + dy2 * dy2) + 1e-10)
# 根据边长平方的比过小或过大提前淘汰这个四边形,如果淘汰过多,调整此比例数字
if ratio < 0.8 or 1.2 < ratio:
# 根据边长平方的比过小或过大提前淘汰这个四边形
return 1.0
return a
def Graphicdetection(srcImage, CLImage, outImage, str):
'''
描述:用于识别和统计形状数量
:param srcImage:
:param CLImage:
:param outImage:
:param str:
:return:
'''
bjImage = srcImage.copy()
# 模糊降噪
cv.GaussianBlur(CLImage, (9, 9), 0, CLImage, 0)
# 边缘检测
outImage = cv.Canny(CLImage, 10, 100)
# 定义一个正方形计数器
zfcount = 0
# 定义一个三角形计数器
sjcount = 0
# 查找轮廓
cloneImage,contours, hierarchy = cv.findContours(outImage, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
for i in range(len(contours)):
# 计算轮廓矩
mu = cv.moments(contours[i], False)
# 计算轮廓的质心
cx = mu['m10'] / mu['m00']
cy = mu['m01'] / mu['m00']
# 画出中心点
cv.circle(bjImage, (np.int(cx), np.int(cy)), 5, (0, 0, 0), -1, 8, 0)
# 绘出多边形
approx = cv.approxPolyDP(contours[i], cv.arcLength(contours[i], True) * 0.02, True)
if len(approx) == 4 & np.int(math.fabs(cv.contourArea(approx))) > 1000 & cv.isContourConvex(approx):
MaxCosine = 0
for j in range(2, 5):
# 正方形
cosine = math.fabs(angle(approx[j % 4], approx[j - 2], approx[j - 1]))
MaxCosine = np.maximum(MaxCosine, cosine)
if MaxCosine < 0.3:
jx = approx
# 绘制出正方形边框
cv.line(bjImage, (jx[0][0][0], jx[0][0][1]), (jx[1][0][0], jx[1][0][1]), (0, 0, 0), 3)
cv.line(bjImage, (jx[1][0][0], jx[1][0][1]), (jx[2][0][0], jx[2][0][1]), (0, 0, 0), 3)
cv.line(bjImage, (jx[2][0][0], jx[2][0][1]), (jx[3][0][0], jx[3][0][1]), (0, 0, 0), 3)
cv.line(bjImage, (jx[3][0][0], jx[3][0][1]), (jx[0][0][0], jx[0][0][1]), (0, 0, 0), 3)
tam = "Square " + str
cv.putText(bjImage, tam, (np.int(cx), np.int(cy) - 10), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0))
zfcount += 1
# 三边形
if len(approx) == 3:
sjx = approx
# 绘制出三角形边框
cv.line(bjImage, (sjx[0][0][0], sjx[0][0][1]), (sjx[1][0][0], sjx[1][0][1]), (0, 0, 0), 3)
cv.line(bjImage, (sjx[1][0][0], sjx[1][0][1]), (sjx[2][0][0], sjx[2][0][1]), (0, 0, 0), 3)
cv.line(bjImage, (sjx[2][0][0], sjx[2][0][1]), (sjx[0][0][0], sjx[0][0][1]), (0, 0, 0), 3)
tam = "Triangle " + str
cv.putText(bjImage, tam, (np.int(cx), np.int(cy) - 10), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0))
sjcount += 1
# 霍夫检测圆
circles = None
# 霍夫圆检测
circles = cv.HoughCircles(CLImage, cv.HOUGH_GRADIENT, 1.5, 10, circles, 200, 100, 0, 0)
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
radius = (i[2]);
tam = "Round " + str
cv.putText(bjImage, tam, (i[0], i[1] - 10), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0))
cv.circle(bjImage, (i[0], i[1]), 3, (0, 0, 0), -1, 8, 0)
# 绘制圆轮廓
cv.circle(bjImage, (i[0], i[1]), radius, (0, 0, 0), 3, 8, 0)
if str == "R":
str = "红色"
print("%s 正方形 有 %d 个" % (str, zfcount))
print("%s 三角形 有 %d 个" % (str, sjcount))
print("%s 圆 有 %d 个" % (str, len(circles)))
if str == "G":
str = "绿色"
print("%s 正方形 有 %d 个" % (str, zfcount))
print("%s 三角形 有 %d 个" % (str, sjcount))
print("%s 圆 有 %d 个" % (str, len(circles)))
if str == "Y":
str = "黄色"
print("%s 正方形 有 %d 个" % (str, zfcount))
print("%s 三角形 有 %d 个" % (str, sjcount))
print("%s 圆 有 %d 个" % (str, len(circles)))
return bjImage
src = cv.imread("1.jpg")
dst = src.copy()
Rdst = findColor(src, 0, 25)
Gdst = findColor(src, 60, 80)
Ydst = findColor(src, 30, 50)[code=python]