python opencv实时显示测量数据_使用Opencv python进行精确测量

我实际上正在使用OpenCV和

Python开发机器视觉项目.

目标:该项目的目标是高精度地测量元件的尺寸.

主要硬件:

> Basler 500万像素摄像头(aca-2500-14gm)

>红色背光(100毫米x 100毫米)(我的组件尺寸约为60毫米)

实验

由于我正在考虑非常严格的公差限制,我首先进行了精确研究.我将组件保留在背光源上并拍摄了100张图像而没有移动部件(想象像100帧的视频).我测量了所有100张图像的外径(OD).我的mm /像素比为0.042.我测量了测量的标准偏差,以找出精度,结果是0.03毫米左右,这是不好的.触摸组件和设置因此我期望精度为0.005 mm.但是我已经退了一个数量级了.我正在使用OpenCV的Hough圆来计算组件的OD.

码:

import sys

import pickle

import cv2

import matplotlib.pyplot as plt

import glob

import os

import numpy as np

import pandas as pd

def find_circles(image,dp=1.7,minDist=100,param1=50,param2=50,minRadius=0,maxRadius=0):

""" finds the center of circular objects in image using hough circle transform

Keyword arguments

image -- uint8: numpy ndarray of a single image (no default).

dp -- Inverse ratio of the accumulator resolution to the image resolution (default 1.7).

minDist -- Minimum distance in pixel distance between the centers of the detected circles (default 100).

param1 -- First method-specific parameter (default = 50).

param2 -- Second method-specific parameter (default = 50).

minRadius -- Minimum circle radius in pixel distance (default = 0).

maxRadius -- Maximum circle radius in pixel distance (default = 0).

Output

center -- tuple: (x,y).

radius -- int : radius.

ERROR if circle is not detected. returns(-1) in this case

"""

circles=cv2.HoughCircles(image,

cv2.HOUGH_GRADIENT,

dp = dp,

minDist = minDist,

param1=param1,

param2=param2,

minRadius=minRadius,

maxRadius=maxRadius)

if circles is not None:

circles = circles.reshape(circles.shape[1],circles.shape[2])

return(circles)

else:

raise ValueError("ERROR!!!!!! circle not detected try tweaking the parameters or the min and max radius")

def find_od(image_path_list):

image_path_list.sort()

print(len(image_path_list))

result_df = pd.DataFrame(columns=["component_name","measured_dia_pixels","center_in_pixels"])

for i,name in enumerate(image_path_list):

img = cv2.imread(name,0) # read the image in grayscale

ret,thresh_img = cv2.threshold(img, 50, 255, cv2.THRESH_BINARY_INV)

thresh_img = cv2.bilateralFilter(thresh_img,5,91,91) #smoothing

edges = cv2.Canny(thresh_img,100,200)

circles = find_circles(edges,dp=1.7,minDist=100,param1=50,param2=30,minRadius=685,maxRadius=700)

circles = np.squeeze(circles)

result_df.loc[i] = os.path.basename(name),circles[2]*2,(circles[0],circles[1])

result_df.sort_values("component_name",inplace=True)

result_df.reset_index(drop=True,inplace=True)

return(result_df)

df = find_od(glob.glob("./images/*"))

mean_d = df.measured_dia_pixels.mean()

std_deviation = np.sqrt(np.mean(np.square([abs(x-mean_d) for x in df.measured_dia_pixels])))

mm_per_pixel = 0.042

print(std_deviation * mm_per_pixel)

输出:0.024

组件的图像:

由于拍摄图像时不会干扰设置,我希望测量的重复性大约为0.005毫米(5微米)(对于100张图像).但事实并非如此.这是霍布圈的问题吗?或者我在这里失踪了什么

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值