基于opencv的鱼群检测和数量统计识别鱼群密度带界面

发布于:2025-06-29 ⋅ 阅读:(21) ⋅ 点赞:(0)

完整项目点文末名片查看获取

一、项目简介
本项目旨在通过计算机视觉技术,实现对视频中鱼类数量的自动检测与计数。利用OpenCV库进行图像处理,包括背景减除、形态学操作、轮廓检测等步骤,最终在视频帧中标记出鱼类并统计其数量。该系统可广泛应用于水产养殖、生态监测等领域,有助于提高工作效率和数据准确性。
在这里插入图片描述

二、环境准备
在开始项目之前,需要确保以下环境和工具已安装:

  1. Python:推荐使用Python 3.6及以上版本。
  2. OpenCV:用于图像处理和视频操作。可通过pip install opencv-python安装。
  3. NumPy:用于数值计算和数组操作。可通过pip install numpy安装。
  4. 视频文件:需要处理的视频文件,应存放在指定路径下。
    三、代码结构与功能
    本项目的代码主要分为以下几个部分,每部分实现特定的功能:
  5. 导入必要的库
    首先,需要导入OpenCV和NumPy库:
  • cv2:OpenCV的Python接口,用于图像和视频处理。
  • numpy:用于高效的数值计算和数组操作。
  1. 创建可调整大小的窗口
    使用OpenCV创建一个窗口用于显示视频,设置窗口为可调整大小的模式,以适应不同分辨率的视频:
  • cv2.namedWindow(“Video”, cv2.WINDOW_NORMAL):创建名为“Video”的窗口,并允许调整大小。
  • cv2.resizeWindow(“Video”, 800, 600):将窗口大小调整为800x600像素,以提高可视性。
  1. 打开视频文件
    通过指定视频文件的路径,使用OpenCV的视频捕捉功能打开视频文件:
  • cv2.VideoCapture(video_path):创建视频捕捉对象,用于逐帧读取视频。
  • 检查视频是否成功打开:如果无法打开视频文件,程序将输出错误信息并退出。
  1. 初始化背景减除器
    背景减除器用于提取视频中的前景(即移动的物体):
  • cv2.createBackgroundSubtractorKNN():使用K近邻方法初始化背景减除器。这种方法适用于动态背景和光照变化。
  1. 定义形态学操作的内核
    形态学操作用于处理二值图像,去除噪声和填补孔洞:
  • cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)):定义一个5x5的矩形内核,用于后续的腐蚀和膨胀操作。
  1. 设置阈值和检测参数
    为了过滤掉小的、无关的物体,需要设置最小宽度、高度和面积的阈值:
  • min_width = 90和min_height = 90:设置最小宽度和高度,以过滤掉尺寸较小的轮廓。
  • detection_line_y = 400:定义检测线的Y坐标,用于判断鱼是否穿过该线。
  • offset = 7:设置检测线的偏移量,确保准确检测鱼穿过检测线的动作。
  1. 定义计算中心点的函数
    为了跟踪鱼的位置,需要计算每个检测到的鱼的中心点:
  • get_center(x, y, w, h):计算给定边界框的中心点坐标 (cx, cy)。
  1. 主循环:逐帧处理视频
    通过一个无限循环,逐帧读取和处理视频,直到视频结束或用户手动退出:
  • cap.read():读取视频的下一帧。如果无法读取(视频结束),则退出循环。
  1. 图像预处理
    对每一帧进行预处理,以提高后续处理的效果:
  • 转换为灰度图像:cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY),减少计算量。
  • 应用高斯模糊:cv2.GaussianBlur(gray, (5, 5), 0),减少图像噪声。
  1. 前景提取
    利用背景减除器提取前景物体:
  • mog.apply(blur):应用背景减除器,得到前景掩膜。
  1. 形态学处理
    通过腐蚀和膨胀操作,去除噪声并填补前景中的孔洞:
  • 腐蚀:cv2.erode(mask, kernel, iterations=1),去除小的白色噪点。
  • 膨胀:cv2.dilate(mask, kernel, iterations=2),恢复物体的大小。
  • 闭运算:cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel),填补物体内部的小孔洞。
  1. 轮廓检测与过滤
    在处理后的掩膜中查找轮廓,并过滤掉不符合条件的轮廓:
  • cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE):查找轮廓。
  • 过滤条件:
    • 根据宽度和高度过滤:轮廓的宽度和高度必须大于设定的最小值。
    • 根据面积过滤:轮廓的面积必须大于设定的最小值,以排除噪声。
  1. 绘制检测线和目标标记
    在视频帧中绘制检测线,并在检测到的鱼的位置绘制边界框和中心点:
  • 绘制检测线:cv2.line(frame, (0, detection_line_y), (frame.shape[1], detection_line_y), (255, 255, 0), 2),用于判断鱼是否穿过。
  • 绘制边界框:cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2),用红色矩形标记鱼的位置。
  • 绘制中心点:cv2.circle(frame, (cx, cy), 5, (0, 255, 0), -1),用绿色圆点表示鱼的中心位置。
  1. 计数逻辑
    通过跟踪鱼的中心点,判断鱼是否穿过检测线,并进行计数:
  • 将每个检测到的鱼的中心点添加到fish_centers列表中。
  • 遍历fish_centers列表,检查每个鱼的中心点是否位于检测线的偏移范围内:
    • 如果是,则将计数器count加1,并从列表中移除该鱼,避免重复计数。
  • 在控制台输出当前的鱼计数:print(f"Fish Count: {count}")。
  1. 显示结果
    在视频帧中显示当前的鱼计数,并展示处理后的帧:
  • 使用cv2.putText在帧上显示鱼的计数信息。
  • 使用cv2.imshow(“Video”, frame)显示处理后的帧。
  1. 退出与资源释放
    设置用户按下‘ESC’键时退出循环,并释放资源:
  • 检测按键事件:cv2.waitKey(30) & 0xFF == 27,按下‘ESC’键(ASCII码27)时退出。
  • 释放视频捕捉对象:cap.release()。
  • 关闭所有OpenCV窗口:cv2.destroyAllWindows()。
    四、结果展示与优化建议
  1. 结果展示
    运行程序后,用户将看到一个显示视频的窗口。在视频中:
  • 红色矩形框标记出检测到的鱼的位置。
  • 绿色圆点表示每条鱼的中心点。
  • 一条蓝色横线作为检测线,位于Y坐标400的位置。
  • 左上角显示当前的鱼计数。
    控制台将实时输出鱼的数量,例如“Fish Count: 3”。
  1. 优化建议
    为了提高系统的准确性和效率,可以考虑以下优化措施:
  • 调整阈值:根据实际视频内容,调整最小宽度、高度和面积的阈值,以适应不同大小和形状的鱼类。
  • 改进背景减除方法:尝试其他背景减除算法,如MOG2,或结合深度学习方法,提高前景提取的准确性。
  • 多目标跟踪:引入目标跟踪算法,如Kalman滤波或深度学习的检测与跟踪模型,提升计数的准确性,尤其是在鱼类密集或快速移动的情况下。
  • 动态检测线:根据视频的不同场景,动态调整检测线的位置,提高灵活性。
  • 性能优化:对于高分辨率视频,可以采用图像下采样或多线程处理,提升实时处理的性能。
    五、总结
    本项目通过利用OpenCV库,实现了一个基于视频的鱼类自动检测与计数系统。通过背景减除、形态学操作和轮廓检测等图像处理技术,有效地提取出鱼类目标,并通过中心点跟踪实现准确计数。该系统在水产养殖和生态监测等领域具有广泛的应用前景。未来,可以通过引入更先进的图像处理和机器学习技术,进一步提升系统的准确性和适用性。

网站公告

今日签到

点亮在社区的每一天
去签到