python+opencv实现机器视觉基础技术(2)(宽度测量,缺陷检测,医学处理)

  本篇博客接着讲解机器视觉的有关技术和知识。包括宽度测量,缺陷检测,医学处理。

一:宽度测量

  在传统的自动化生产中,对于尺寸的测量,典型的方法就是千分尺、游标卡尺、塞尺等。而这些测量手段测量精度低、速度慢,无法满足大规模的自动化生产需求。基于机器视觉的尺寸测量属于非接触式的测量,具有检测精度高、速度快、成本低、安装简便等优点。可以检测零件的各种尺寸,如长度、圆、角度、线弧等测量。

  利用python+opencv方法可以进行宽度的测量。步骤是先选取出一个矩形,然后进行阈值分割,再进行反色,边缘提取之后进行点的选择,输出坐标做出两条线段,根据线段进行矩形绘制,这样之后就可以计算两条直线之间的距离,也就是我们需要求得的宽度。

  OpenCV是一个c++库,用于实时处理计算机视觉方面的问题,涵盖了很多计算机视觉领域的模块。配合python调用c++库,可以很方便地进行宽度测量,实现要求。

  步骤如下:

1.导入需要的库
import cv2
import cv2 as cv
import numpy as np
import imutils
2.读取原图像查看
img = cv2.imread("1.jpg")

3.截取部分图像

  手动地进行选取我们感兴趣的部分,然后截取出来。

img = imutils.resize(img, width=500)
roi = cv2.selectROI(windowName="image1", img=img, showCrosshair=True, fromCenter=False)
x, y, w, h = roi
cv2.rectangle(img=img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255), thickness=2)
s = img[y:y+h,x:x+w]

4.反色

  截取后会出现空白区域很多黑色的情况,需要进行反色,用到的方法是255去除值。

# 反色
def colorReverse(src):
	height, width, channels = src.shape
	for row in range(height):
	    for list in range(width):
	        for c in range(channels):
	            pv = src[row, list, c]
	            src[row, list, c] = 255 - pv
	return src
src = colorReverse(s)
5.边缘检测去噪
x = cv2.Sobel(src,cv2.CV_16S,1,0)
y = cv2.Sobel(src,cv2.CV_16S,0,1)
absX = cv2.convertScaleAbs(x)   # 转回uint8
absY = cv2.convertScaleAbs(y)
dst = cv2.addWeighted(absX,0.5,absY,0.5,0)
result = colorReverse(dst)
6.输出鼠标选择点的坐标

  之后进行的操作是利用鼠标选择点,并显示坐标,可以判断时候用鼠标进行点击操作,如果是的话,就可以输出点的坐标在输出框或者图片上标记,把点击函数作为参数,就可以在不点击退出键的时候进行循环递归操作,知道最直到获得想要点的坐标。

# 输出鼠标选择点的坐标
# setMouseCallback使用的回调函数,这个回调函数在捕获到鼠标左键点击事件时,就在图片上点击处绘制一个实心的圆、并显示出坐标。
def on_EVENT_LBUTTONDOWN(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        xy = "%d,%d" % (x, y)
        print (xy)
        cv2.circle(result, (x, y), 1, (255, 0, 0), thickness = -1)
        cv2.putText(result, xy, (x, y), cv2.FONT_HERSHEY_PLAIN,
                    1.0, (0,0,0), thickness = 1)
        cv2.imshow("image2", result)

cv2.namedWindow("image2")
cv2.setMouseCallback("image2", on_EVENT_LBUTTONDOWN)
cv2.imshow("image2", result)
7.绘制线段用输出提示

  接下来就可以根据选择的四个点进行连接输出线段,用get_len()方法可以得到两条线之间的距离。

# 绘制线段
s = cv2.line(result,(3, 30), (120, 30), (0, 255, 0), 2)
d = cv2.line(result,(3, 110), (118, 110), (0,255, 0), <
<think>嗯,用户想了解如何使用OpenCV实现机器视觉功能,以及机器视觉OpenCV的关系。首先,我需要明确机器视觉OpenCV的基本概念。机器视觉主要是通过图像处理和分析来让机器做出决策,而OpenCV是一个开源库,提供了很多实现这些功能的工具。 接下来,用户的问题可能包括具体步骤和例子。根据引用[3],OpenCV可以用于尺寸测量缺陷检测等。比如宽度测量,步骤包括图像处理、边缘检测、坐标计算。可能需要提到图像预处理技术,比如阈值分割、边缘检测,以及如何使用OpenCV的函数实现这些步骤。 另外,用户可能想知道OpenCV机器视觉中的具体应用场景,比如工业检测医学影像处理。引用[1]中提到机器人视觉的应用,比如使用Kinect和USB摄像头,这可以作为例子说明OpenCV的实际使用。 还要考虑OpenCV基础知识,比如图像读取、显示、保存,这些是开发的基础。引用[2]中的仿射变换例子,可以展示OpenCV如何处理图像变换,这也是机器视觉中的常见操作。 可能需要分步骤回答,先介绍关系,再讲开发流程,然后举例说明。确保每个步骤都有对应的OpenCV函数和代码示例,比如使用cv2.imread读取图像,cv2.Canny进行边缘检测,cv2.findContours找轮廓等。 同时,用户可能对性能优化或实际应用中的问题感兴趣,比如实时处理、图像延迟,引用[1]提到Kinect的延迟问题,可以建议使用更高效的摄像头或优化代码。 最后,生成相关问题时要覆盖基本概念、具体应用、优化方法和实际挑战,帮助用户深入理解。</think>### 机器视觉OpenCV的关系及开发实现 机器视觉是通过计算机模拟人类视觉功能,实现图像分析、目标检测测量等任务的技术,而**OpenCV**是支持这一目标的开源工具库,提供超过2500种优化算法,涵盖图像处理、特征提取、三维重建等核心功能[^1][^3]。 --- ### 使用OpenCV实现机器视觉功能的开发流程 #### 1. **基础图像操作** - **图像读取与显示** ```python import cv2 img = cv2.imread('image.jpg') # 读取图像 cv2.imshow('Image', img) # 显示图像 cv2.waitKey(0) # 等待按键 ``` 支持格式:JPEG、PNG、TIFF等[^1]。 - **图像预处理** - **灰度化**:`gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)` - **阈值分割**:`ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)` - **边缘检测**:`edges = cv2.Canny(gray, 50, 150)` [^3]。 #### 2. **典型机器视觉任务实现** - **尺寸测量** 通过边缘检测和轮廓分析计算物体宽度: ```python contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: x, y, w, h = cv2.boundingRect(cnt) cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2) print(f"宽度:{w} 像素") # 实际需结合像素标定换算物理尺寸 ``` 此方法已用于工业零件检测[^3]。 - **目标跟踪** 使用光流法或深度学习模型(如YOLO): ```python # 示例:基于背景减除的运动检测 fgbg = cv2.createBackgroundSubtractorMOG2() fgmask = fgbg.apply(img) ``` #### 3. **仿射变换与几何校正** 通过变换矩阵实现图像旋转、平移: ```python M = cv2.getRotationMatrix2D((w//2, h//2), 45, 1.0) # 绕中心逆时针旋转45度 rotated = cv2.warpAffine(img, M, (w, h)) # 应用变换 ``` 此技术可用于图像配准或机器人视角校正[^2]。 --- ### 机器视觉开发中的关键问题 1. **实时性优化** - 使用`cv2.UMat`加速GPU计算 - 降低图像分辨率或ROI(感兴趣区域)裁剪 - 避免在循环中重复初始化模型[^1]。 2. **标定与精度保证** - 相机标定:通过棋盘格校正镜头畸变 - 像素-物理尺寸转换:需已知参考物体的实际尺寸。 --- ### 应用场景 - **工业检测**:零件尺寸测量、表面缺陷检测[^3] - **机器人导航**:SLAM中的环境特征提取[^1] - **医学影像**:细胞计数、病灶区域分割。 ---
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SAP顾问李昂

你的创作将会激励我,谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值