opencv-python 机器视觉:宽度测量
在原图上选择处理区域,对处理区域图像二值化分割、反色、边缘提取,从而测得目标图像的宽度。并将处理区域覆盖在原图上,显示测得的宽度值。
原图如下:
我们要做的就是测量该U盘的宽度。
废话不多说,直接上源码
import cv2
import numpy as np
import imutils
if __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()读取边框的时候出错。
解决方法:可以不画这个框,即不要这行代码。也可以在原图副本上绘制,只要不在原图上操作就行。重点就是截取图里不能出现你画的框。
2、鼠标截取的时候,出现的是十字框(个人觉得不太好看),查了一下cv2.selectROI用法
selectROI(windowName, img, showCrosshair=None, fromCenter=None):
. 参数windowName:选择的区域被显示在的窗口的名字
. 参数img:要在什么图片上选择ROI
. 参数showCrosshair:是否在矩形框里画十字线.
. 参数fromCenter:是否是从矩形框的中心开始画
3、测量值偏差较大
如图可以看到两次的结果出入很大,原因是在设置截取区域时窗口设置太大,导致放大了图片。
错误:
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
宽度测量参考博客
选择边框界参考博客