前言
在水产养殖行业中,鱼体长度是衡量鱼类品质和成熟度的重要指标。然而,传统的鱼体长度测量方法需要手动测量,不仅耗时耗力还容易出现误差。正好最近做了一个基于双目视觉的鱼体检测项目,在这里和大家分享以下思路。
步骤
第一步:标定
在实际应用中,摄像头会产生畸变,因此我们需要对摄像头进行标定。首先需要准备一块棋盘,将其放在摄像头的视野范围内,然后用代码控制摄像头获取多张图片,并且使用OpenCV库的calibrateCamera函数进行标定。
对于摄像头获取的图像,我们需要去除畸变。通过OpenCV库中的undistort函数实现。接下来,我们需要进行极线校正,以获得两个校准好的图像。在此过程中,我们需要在左右图像之间进行极线匹配和摄像头校准。这里我们使用OpenCV中的stereoRectifyUncalibrated函数实现,它能够自动地计算出左右图像之间的极线匹配关系。
第二步:检测目标
通过yolov5训练我们想要识别的鱼体目标,然后进行目标检测,获得检测框的位置。
针对检测框内的目标进行图像处理,获取鱼体的头和尾的图像坐标。
第三步:计算鱼体长度
使用双目视觉中的三角测量方法计算出鱼头和尾在相机坐标系中的三维坐标。最后,我们使用欧氏距离计算出鱼体长度。
Z1 = B[0] * F / result[0][1]
X1 = (u1 - cx) * Z1 / fx1
Y1 = (v1 - cy) * Z1 / fy1
u2 = result[1][0][0]
v2 = result[1][0][1]
Z2 = B[0] * F / result[1][1]
X2 = (u2 - cx) * Z2 / fx1
Y2 = (v2 - cy) * Z2 / fy1
distance = np.sqrt((X1 - X2) ** 2 + (Y1 - Y2) ** 2 + (Z1 - Z2) ** 2)