python opencv 对象测量

本文详细介绍了一种基于OpenCV的图像处理技术,通过灰度转换、二值化及轮廓检测实现目标对象的识别与测量。文章展示了如何利用Python进行图像预处理,包括阈值设定、轮廓提取以及几何矩计算等关键步骤,最终实现了对图像中对象的精确定位和尺寸测量。
import cv2 as cv  
import numpy as np  
  
def measure_object(img):  
    gray=cv.cvtColor(img,cv.COLOR_RGB2GRAY)  
    ret,binary=cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)  
#     cv.imshow("binary img",binary)  
    outImg,contours,hireachy=cv.findContours(binary,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE) 
#     print(contours)
    for i ,contour in enumerate(contours):  
        #轮廓面积  
        area=cv.contourArea(contour)  
        #轮廓外接矩形面积  
        area=cv.contourArea(contour)  
        x,y,w,h=cv.boundingRect(contour)  
#         #几何矩  
        mm=cv.moments(contour)  
        if mm['m00']!=0: 
            cx=mm['m10']/mm['m00']  
            cy=mm['m01']/mm['m00']  
            cv.circle(img,(np.int(cx),np.int(cy)),3,(0,255,0),-1)  
            cv.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)  
    cv.imshow("mo",img)  
  
src=cv.imread('shou.jpg')  
cv.imshow('def',src)  
measure_object(src)  
cv.waitKey(0)  
cv.destroyAllWindows()  

在这里插入图片描述

### 使用PythonOpenCV计算长方体体积 为了使用PythonOpenCV库来测量长方体的体积,可以通过以下方法实现: #### 准备环境 确保安装了必要的软件包并配置好开发环境。所需的主要组件包括: - Python 版本:3.7.6 或更高版本 - 功能包:`opencv-python (4.2.0.32)` 和 `numpy (1.20.2)` 这些工具可以帮助处理图像数据以及执行几何变换。 ```bash pip install opencv-python==4.2.0.32 numpy==1.20.2 ``` #### 获取参考物与待测对象图片 采用已知尺寸的标准参照物(例如宽度为210毫米、长度为297毫米的一张A4纸),将其放置在同一平面内并与目标长方体一起拍摄照片或通过摄像设备获取视频流帧画面[^1]。 #### 图像预处理 读取输入图像并对之进行灰度化和平滑滤波操作以便后续边缘检测更加精准有效。 ```python import cv2 import numpy as np def preprocess_image(image_path): img = cv2.imread(image_path, 1) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray, (5, 5), 0) return blurred ``` #### 边缘提取与轮廓查找 利用Canny算子或其他合适的算法找到物体边界线段集合,并基于此定位到矩形区域内的四个顶点坐标位置。 ```python def find_contours(preprocessed_img): edges = cv2.Canny(preprocessed_img, 50, 150) contours, _ = cv2.findContours(edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) rect_contour = None max_area = 0 for contour in contours: area = cv2.contourArea(contour) if area > max_area and len(cv2.approxPolyDP(contour, 0.02 * cv2.arcLength(contour, True), True)) == 4: max_area = area rect_contour = contour return rect_contour ``` #### 计算实际距离比例因子 根据之前提到过的标准参照物的实际大小,在同一场景下确定像素单位对应的真实世界中的物理尺度关系。 ```python def calculate_ratio(rect_contour_a4_paper): A4_WIDTH_MM = 210 A4_HEIGHT_MM = 297 points = rect_contour_a4_paper.reshape(4, 2).astype(np.float32) width_pixels = np.linalg.norm(points[1]-points[0]) height_pixels = np.linalg.norm(points[-1]-points[0]) ratio_w = A4_WIDTH_MM / width_pixels ratio_h = A4_HEIGHT_MM / height_pixels avg_ratio = (ratio_w + ratio_h)/2 return avg_ratio ``` #### 测量长方体各边长及其高度 对于每一个识别出来的长方体实例,分别求解其底面四条边对应的直线段端点之间的欧几里得距离乘上先前得到的比例系数即可得出相应方向上的真实尺寸;而关于高程信息,则可通过立体匹配技术或者双目视觉系统获得两幅不同视角下的视差图进而估算出来。 ```python def measure_dimensions(rect_contour_object, pixel_to_mm_ratio): object_points = rect_contour_object.reshape(-1, 2).astype(float) w_px = np.linalg.norm(object_points[1] - object_points[0]) h_px = np.linalg.norm(object_points[-1] - object_points[0]) real_width = round(w_px * pixel_to_mm_ratio, 2) real_height = round(h_px * pixel_to_mm_ratio, 2) # 假设我们已经得到了深度z的信息 depth_z = get_depth_information() volume = real_width * real_height * depth_z return {"width":real_width,"height":real_height,"depth":depth_z,"volume":volume} ``` 请注意上述代码片段仅为概念验证性质的功能模块示意而非完整的解决方案框架,具体实施过程中可能还需要考虑更多细节因素比如光照变化影响、相机畸变校正等问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值