基于双目立体视觉的羊体尺参数提取及三维重构的解析方案【附代码】
✨ 长期致力于羊体尺参数、双目立体视觉、三维重构、图像分割、测点识别研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)改进Graph Cut与多尺度分水岭融合的羊体图像分割:
在真实养殖场复杂背景下,先采用多尺度分水岭算法预分割,再用模糊C均值初始化Graph Cut的种子点。交互次数从15次降到6次,平均分割时间6.47秒,分割准确率97%。针对曝光过度图像,采用带色彩恢复的多尺度Retinex增强,提高暗部细节。对200张羊图像测试,分割度量值F达到0.97。
(2)基于包络线分析的体尺测点自动识别:
从分割轮廓中提取羊体包络线,通过曲率极值定位关键点。体长测点为鼻尖到尾根的最远点对,体高为肩胛最高点,胸深为肩胛后缘垂直距离。对50头羊的二维图像测量,体长平均误差1.6cm,相对误差1.92%。采用偏最小二乘回归建立体重预估模型,包含体长、体高、臀高三个变量,预测体重平均相对误差3.17%。
(3)双目立体视觉稠密点云与NURBS曲面重构:
利用SIFT特征匹配和RANSAC极线约束获得稀疏匹配点,再通过区域生长插值生成稠密点云。点云去噪采用统计滤波,保留距离均值1.5倍标准差内的点。采用NURBS曲面拟合重构羊体三维模型,从模型中提取胸围和管围。30只羊的实测对比显示,体尺综合检测相对误差3.47%,胸围误差4.2%。虽然略高于主动式激光扫描,但无需接触且成本低。
import numpy as np import cv2 from scipy.spatial import cKDTree class SheepSegmentation: def __init__(self): self.msr_scale = [15,80,200] def msr_enhance(self, img): img_float = img.astype(np.float32)/255.0 log_img = np.log(img_float + 1e-5) for sigma in self.msr_scale: blur = cv2.GaussianBlur(img_float, (0,0), sigma) log_blur = np.log(blur + 1e-5) log_img -= log_blur return np.exp(log_img) def graph_cut_seg(self, img, seeds): # 使用opencv的grabcut简化 mask = np.zeros(img.shape[:2], np.uint8) rect = (10,10, img.shape[1]-20, img.shape[0]-20) bgdModel = np.zeros((1,65), np.float64) fgdModel = np.zeros((1,65), np.float64) cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT) return mask class BodyMeasure: def extract_contour_points(self, mask): contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnt = max(contours, key=cv2.contourArea) # 计算凸包和曲率 hull = cv2.convexHull(cnt) return hull.reshape(-1,2) def measure_body_length(self, points): # 最远点对 tree = cKDTree(points) dist, idx = tree.query(points, k=2) far_pair = np.argmax(dist[:,1]) return np.linalg.norm(points[far_pair] - points[idx[far_pair,1]])