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,h x, y, w, h = cv.boundingRect(approx) # 如果顶角数为3,判定为三角形 if objCor == 3: objectType = "Tri" # 如果顶角数为4 elif 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" # 如果有其它情况,标注为None else: 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)