import numpy as np import cv2 as cv import matplotlib.pyplot as plt#读取图像cv.imread()#读取图像cv.imshow()#绘制直线 cv.line(img,start,end,color,thickness)#绘制圆形 cv.circle(img,centerpoint, r, color, thickness)#绘制矩形 cv.rectangle(img,leftupper,rightdown,color,thickness)#向图像中添加文字 cv.putText(img,text,station, font, fontsize,color,thickness,cv.LINE_AA)# 1 创建一个空白的图像 # img = np.zeros((512,512,3), np.uint8) # # 2 绘制图形 # cv.line(img,(0,0),(511,511),(255,0,0),5) # cv.rectangle(img,(384,0),(510,128),(0,255,0),3) # cv.circle(img,(447,63), 63, (0,0,255), -1) # font = cv.FONT_HERSHEY_SIMPLEX # cv.putText(img,'赵慕溪',(10,500), font, 4,(255,255,255),2,cv.LINE_AA) # # 3 图像展示 # plt.imshow(img[:,:,::-1]) # plt.title('匹配结果'), plt.xticks([]), plt.yticks([]) # plt.show()# 1 读取图像 # img1 = cv.imread("view.jpg") # img2 = cv.imread("rain.jpg")# # 2 加法操作 # img3 = cv.add(img1, img2) # cv中的加法 # img4 = img1 + img2 # 直接相加 # # # 3 图像显示 # fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100) # axes[0].imshow(img3[:, :, ::-1]) # axes[0].set_title("cv中的加法") # axes[1].imshow(img4[:, :, ::-1]) # axes[1].set_title("直接相加") # plt.show()# 2 图像混合 # img3 = cv.addWeighted(img1, 0.5, img2, 0.5, 0) # # # 3 图像显示 # plt.figure(figsize=(8, 8)) # plt.imshow(img3[:, :, ::-1]) # plt.show()# img = cv.imread("sheep3.png") # #水平方向堆叠5张 # imgHor = np.hstack((img, img, img, img, img, img, img, img, img, img, img, img, img)) # # 垂直方向堆叠3张 # imgVer = np.vstack((img, img, img, img, img, img, img, img)) # # cv.imshow("Horizontal", imgHor) # cv.imshow("Vertical", imgVer) # cv.waitKey(0)# # # 原始图像 # img = cv.imread(".#1113.jpg") # # # HSV图像, 把BGR通道转变成HSV # imgHSV = cv.cvtColor(img, cv.COLOR_BGR2HSV) # # cv.imshow("Original", img) # cv.imshow("HSV", imgHSV) # cv.waitKey(0)## 图片尺寸减小函数(计算机屏幕看着太大,所以减小,你可以不减小)def getContours(img):# findContours()接收的是二值黑白图, 所以整个代码最下面调用getContours函数时传入的图片是imgCanny, imgCanny是二值黑白图(忘记的点击目录看第6个)# 返回两个:轮廓本身,轮廓属性# 参数:寻找轮廓的图像,检索外轮廓(轮廓检索模式),存储所有的轮廓点(轮廓的近似办法)contours, hierarchy = cv.findContours(img, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)for cnt in contours:# 计算轮廓面积area = cv.contourArea(cnt)# 画出轮廓面积大于2000的轮廓(筛选一下)if area > 2000:# 参数:待画轮廓图像,待画轮廓,轮廓索引(-1#表示都画),轮廓颜色, 轮廓线条粗细cv.drawContours(imgContour, cnt, -1, (255, 0, 0), 3)# 计算轮廓的周长peri = cv.arcLength(cnt, closed=True)# 判断点到相对应的line segment 的距离的阈值。# 距离大于此阈值则舍弃,小于此阈值则保留,epsilon越小,折线的形状越“接近”曲线。approx = cv.approxPolyDP(cnt, 0.02 * peri, closed=True)# 每个图形,角的个数objCor = len(approx)# 获得每个图形角外套的框的左上角坐标,以及w,hx, y, w, h = cv.boundingRect(approx)# 如果顶角数为3,判定为三角形if objCor == 3:objectType = "Tri"# 如果顶角数为4elif objCor == 4:aspRatio = w / h# 如果0#.95 < 宽高比 < 1.05,就是正方形(因为实际图片长宽不一定完全相等)if aspRatio > 0.95 and aspRatio < 1.05:objectType = "Square"# 不在这个范围,基本判定为长方形else:objectType = "Rectangle"# 如果大于4, 就是圆形elif objCor > 4:objectType = "Circle"# 如果有其它情况,标注为Noneelse:objectType = "None"# 画框,参数:待画框的图,框左上角,右下角的坐标,框的颜色,框的粗细cv.rectangle(imgContour, (x, y), (x + w, y + h), (0, 255, 0), 2)# 添加文字,参数:待画框的图,文本信息,文本左下角的坐标(w, h),字体,字体大小,字体颜色,字体粗细cv.putText(imgContour, objectType, int((x + (w / 2) - 10), int(y + (h / 2) - 10)), cv.FONT_HERSHEY_COMPLEX, 0.8,(0, 0, 0), 2)img = cv.imread("shapes3.png") # 拷贝一份彩图,轮廓,检测框,文字都要添加再这张图上 imgCanny = cv.Canny(img, 200, 250) imgContour = img.copy() getContours(imgCanny)def image_process(img, size):imgResize = cv.resize(img, (int(img.shape[1] * size), int(img.shape[0] * size)))return imgResize# 原图尺寸缩小为原来的0.6倍 cv.imshow("Original", image_process(img, 0.6)) cv.waitKey(0)