当前位置: 首页 > news >正文

opencv 中如何通过欧式距离估算实际距离(厘米)

1:这个方法个人测试觉得是正确的,误差较小,目前满足我当前的需求,如果方法不对,请大家评论,完善。

2:确保拍摄的参照物是垂直的,如果不垂直,就会有误差,不垂直的角度越大,误差越大。

实际中主要是利用无人机拍摄的俯视图,计算边缘到特定点的距离。

3:使用棋盘格作为物理参照物,如下

4:代码

import cv2
import numpy as np
import glob
def get_K_and_D(checkerboard, imgsPath):CHECKERBOARD = checkerboardsubpix_criteria = (cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 30, 0.01)calibration_flags = cv2.fisheye.CALIB_RECOMPUTE_EXTRINSIC+cv2.fisheye.CALIB_CHECK_COND+cv2.fisheye.CALIB_FIX_SKEWobjp = np.zeros((1, CHECKERBOARD[0]*CHECKERBOARD[1], 3), np.float32)objp[0,:,:2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)*50_img_shape = None#print(objp)#objp+=200objpoints = []imgpoints = []images = glob.glob(imgsPath + '/*.jpg')for fname in images:img = cv2.imread(fname)if _img_shape == None:_img_shape = img.shape[:2]else:assert _img_shape == img.shape[:2], "All images must share the same size."gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD,cv2.CALIB_CB_ADAPTIVE_THRESH) #+cv2.CALIB_CB_FAST_CHECK+cv2.CALIB_CB_NORMALIZE_IMAGE)if ret == True:objpoints.append(objp)cv2.cornerSubPix(gray,corners,(5,5),(-1,-1),subpix_criteria)imgpoints.append(corners)#print(images)N_OK = len(objpoints)#print(objpoints)K = np.zeros((3, 3))D = np.zeros((4, 1))rvecs = [np.zeros((1, 1, 3), dtype=np.float64) for i in range(N_OK)]tvecs = [np.zeros((1, 1, 3), dtype=np.float64) for i in range(N_OK)]rms, _, _, _, _ = cv2.fisheye.calibrate(objpoints,imgpoints,gray.shape[::-1],K,D,rvecs,tvecs,calibration_flags,(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 30, 1e-6))DIM = _img_shape[::-1]print("Found " + str(N_OK) + " valid images for calibration")print("DIM=" + str(_img_shape[::-1]))print("K=np.array(" + str(K.tolist()) + ")")print("D=np.array(" + str(D.tolist()) + ")")print("rms",rms)return DIM, K, D,cornersif __name__ == '__main__':BORAD_HEIGHT=3BORAD_WIDTH=3radius = 1color = (0, 0, 255)  # BGR格式,红色thickness = 2DIM, K, D,corners = get_K_and_D((BORAD_HEIGHT, BORAD_WIDTH), './distance')   dst_img=cv2.imread("./distance/img_dst_distance.jpg")cnt=0print(corners)for index in range(len(corners)): x, y = corners[index][0]color = (0, 0, 255)  # BGR格式,红色cv2.putText(dst_img, str(cnt), (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 1,color, thickness)color = (0, 255, 255)  # BGR格式,红色cv2.circle(dst_img,(int(x),int(y)), radius, color, thickness)cnt+=1dist_total=0for i in range(BORAD_HEIGHT):print(i * BORAD_WIDTH,(i+1) * BORAD_WIDTH-1)print(corners[i * BORAD_WIDTH,:])dist = cv2.norm(corners[i * BORAD_WIDTH,:], corners[(i+1) * BORAD_WIDTH-1,:], cv2.NORM_L2)dist_total += dist / (BORAD_WIDTH - 1)dist_square = dist_total / BORAD_HEIGHTprint("dst_img.shape:",dst_img.shape)print("dist_square:",dist_square)realy_board_length=13.5/2 #厘米,13.5是从尺子测量出来2个正方形边长的长度,所以单个要除以2realy_H=dst_img.shape[0]*realy_board_length/dist_squarerealy_W=dst_img.shape[1]*realy_board_length/dist_squareprint("realy_H",realy_H)print("realy_W",realy_W)ret=1cv2.drawChessboardCorners(dst_img, (BORAD_HEIGHT,BORAD_WIDTH), corners, ret)cv2.imshow("org_img", dst_img)cv2.waitKey(0) 

http://www.lryc.cn/news/399547.html

相关文章:

  • Flask+Layui开发案例教程
  • 复现ORB3-YOLO8项目记录
  • 【jvm】字符串常量池问题
  • STM32学习和实践笔记(39):I2C EEPROM实验
  • 【Js】导出 HTML 为 Word 文档
  • c++入门基础篇(上)
  • Java实现数据结构——双链表
  • Python应用爬虫下载QQ音乐歌曲!
  • AWS-WAF-Log S3存放,通过Athena查看
  • 无法解析主机:mirrorlist.centos.org Centos 7
  • 自动驾驶论文总结
  • 【uniapp微信小程序】uniapp微信小程序——页面通信
  • 【笔记】从零开始做一个精灵龙女-画贴图阶段(上)
  • 线性代数|机器学习-P22逐步最小化一个函数
  • SpringCloudAlibaba Nacos配置中心与服务发现
  • .NET 一款获取内网共享机器的工具
  • 备考美国数学竞赛AMC8和AMC10:吃透1850道真题和知识点(持续)
  • 旅游景区度假村展示型网站如何建设渠道品牌
  • Python酷库之旅-第三方库Pandas(021)
  • jvm 06 补充 OOM 和具体工具使用
  • 使用机器学习 最近邻算法(Nearest Neighbors)进行点云分析 (scikit-learn Open3D numpy)
  • 安装jenkins最新版本初始化配置及使用JDK1.8构建项目详细讲解
  • 微软子公司Xandr遭隐私诉讼,或面临巨额罚款
  • 【VRP】基于常春藤算法IVY求解带时间窗的车辆路径问题TWVRP,最短距离附Matlab代码
  • 常用软件的docker compose安装
  • Excel第28享:如何新建一个Excel表格
  • 计算机网络知识汇总
  • 数据结构——考研笔记(二)线性表的定义和线性表之顺序表
  • quota使用
  • 解决fidder小黑怪倒出JMeter文件缺失域名、请求头