计算机视觉|opencv-python 机器视觉(宽度测量)

【计算机视觉|opencv-python 机器视觉(宽度测量)】opencv-python 机器视觉:宽度测量
目的 在原图上选择处理区域,对处理区域图像二值化分割、反色、边缘提取,从而测得目标图像的宽度。并将处理区域覆盖在原图上,显示测得的宽度值。
原图如下:
计算机视觉|opencv-python 机器视觉(宽度测量)
文章图片

我们要做的就是测量该U盘的宽度。
运行结果 首先截取图像,控制鼠标,按住左键截取,回车继续。
计算机视觉|opencv-python 机器视觉(宽度测量)
文章图片

计算机视觉|opencv-python 机器视觉(宽度测量)
文章图片

源码 废话不多说,直接上源码

import cv2 import numpy as np import imutilsif __name__ == "__main__": #读取图片 img = cv2.imread("gongjian1-2.bmp") cv2.imshow("img",img) #截取目标区域 img = imutils.resize(img, width=img.shape[1]) roi = cv2.selectROI(windowName="image1", img=img, showCrosshair=False, fromCenter=False) dx, dy, dw, dh = roi #img1=img.copy()这两句可要可不要 #cv2.rectangle(img=img1, pt1=(dx, dy), pt2=(dx + dw, dy + dh), color=(0, 0, 255), thickness=2) recimg = img[dy:dy+dh,dx:dx+dw] #二值化处理 ret, th = cv2.threshold(recimg, 80, 255, cv2.THRESH_BINARY_INV) cv2.imshow("img3",th) # 边缘检测、图片反色 img1 = cv2.Canny(recimg, 100, 200) img1 = 255 - cv2.cvtColor(img1, cv2.COLOR_BGR2RGB) img2 = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY) img2 = cv2.cvtColor(255 - th, cv2.COLOR_RGB2GRAY) cv2.imshow("img4",img2) #边缘检测,框出物体的轮廓 contours, hierarchy = cv2.findContours(img2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnt = contours[0] x, y, w, h = cv2.boundingRect(cnt) # 绘制直线 cv2.line(img1, (x, y), (x, y+h), (0,255,0), 3, 5) cv2.line(img1, (x + w, y), (x + w, y+h), (0, 255, 0), 3, 5) img[dy:dy+dh, dx:dx+dw] = img1 #图片上添加宽度大小 cv2.putText(img,'width:'+str(w),(10,30),cv2.FONT_HERSHEY_COMPLEX,1,(0,255,0),1) cv2.imshow('re',img) cv2.waitKey(0)

问题及解决方法 1、最开始显示的图片是这样的,截取到的图片多了一层外边框。是由于在截取了目标区域后加入了以下代码:cv2.rectangle(img=img1, pt1=(dx, dy), pt2=(dx + dw, dy + dh), color=(0, 0, 255), thickness=2),直接在原图上绘制了一个截取框,这一步相当于污染了原图,才会导致反色后的图像有一层外边框,cv2.findContours()读取边框的时候出错。
计算机视觉|opencv-python 机器视觉(宽度测量)
文章图片

解决方法:可以不画这个框,即不要这行代码。也可以在原图副本上绘制,只要不在原图上操作就行。重点就是截取图里不能出现你画的框。
2、鼠标截取的时候,出现的是十字框(个人觉得不太好看),查了一下cv2.selectROI用法
selectROI(windowName, img, showCrosshair=None, fromCenter=None):
. 参数windowName:选择的区域被显示在的窗口的名字
. 参数img:要在什么图片上选择ROI
. 参数showCrosshair:是否在矩形框里画十字线.
. 参数fromCenter:是否是从矩形框的中心开始画
计算机视觉|opencv-python 机器视觉(宽度测量)
文章图片

3、测量值偏差较大
计算机视觉|opencv-python 机器视觉(宽度测量)
文章图片

如图可以看到两次的结果出入很大,原因是在设置截取区域时窗口设置太大,导致放大了图片。
错误:
imutils.resize(img, width=500)
正确:
imutils.resize(img, width=img.shape[1])
拓展:
img.shape[0]#height(rows) of image
img.shape[1]#width(colums) of image
img.shape[2]#the pixels value is made up of three primary colors
参考博客 宽度测量参考博客
选择边框界参考博客

    推荐阅读