opencv-python 机器视觉:宽度测量

opencv-python 机器视觉:宽度测量

目的

在原图上选择处理区域,对处理区域图像二值化分割、反色、边缘提取,从而测得目标图像的宽度。并将处理区域覆盖在原图上,显示测得的宽度值。
原图如下:
opencv-python 机器视觉:宽度测量_第1张图片
我们要做的就是测量该U盘的宽度。

运行结果

首先截取图像,控制鼠标,按住左键截取,回车继续。
opencv-python 机器视觉:宽度测量_第2张图片
opencv-python 机器视觉:宽度测量_第3张图片

源码

废话不多说,直接上源码

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

opencv-python 机器视觉:宽度测量_第5张图片
3、测量值偏差较大
opencv-python 机器视觉:宽度测量_第6张图片
如图可以看到两次的结果出入很大,原因是在设置截取区域时窗口设置太大,导致放大了图片。
错误:
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

参考博客

宽度测量参考博客
选择边框界参考博客

你可能感兴趣的:(计算机视觉,opencv,python)