图片处理:测量鱼类问题

2024-04-26 02:28:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我在绘制实时视频截图时遇到问题。我正在Python上使用OpenCV

我的目的是测量一条一条穿过一条管子的罗非鱼,并通过获得矩形尺寸得到它们的大致尺寸。Here是1个罗非鱼通过的样本。在

Here是另一个带背光的

问题是水也被检测成一个轮廓,我似乎无法将鱼隔离。我尝试过使用模糊技术、扩张技术、腐蚀技术,但似乎不能解决我的问题。在

还有其他算法可以用吗?还是应该切换到目标检测?

我的代码是:

#!/usr/bin/env python3
import numpy as np
import cv2
import time

kernel = np.ones((5,5),np.uint8)

cap = cv2.VideoCapture('white.mp4')

foreground_background = cv2.createBackgroundSubtractorMOG2()
while True:
    ret, frame = cap.read()

    if(type(frame) == type(None)):
        break
    gray                 = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    #gray                = cv2.GaussianBlur(gray, (21, 21), 0)
    #gray                = cv2.medianBlur(gray,11)
    gray                 = cv2.bilateralFilter(gray,9,75,75)
    ret,thresh           = cv2.threshold(gray, 127, 255 , cv2.THRESH_BINARY_INV)
    thresh               = cv2.erode(thresh, kernel, iterations=3)
    thresh               = cv2.dilate(thresh, kernel, iterations=3)
    im2, cnts, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, 
    cv2.CHAIN_APPROX_SIMPLE)
    c=None
    for c in cnts:

         (x, y, w, h) = cv2.boundingRect(c)
         cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2)         

    cv2.imshow('Output', thresh)
    cv2.waitKey(2)

cap.release()
cv2.destroyAllWindows()

以下由马克·塞切尔补充。。。如果有人想看到单独的帧,我以10 fps的速度提取帧,并将帧蒙太奇,如下所示:

enter image description here

使用的命令:

^{pr2}$

Tags: importnonehere尺寸typenpcv2kernel
1条回答
网友
1楼 · 发布于 2024-04-26 02:28:24

我会尝试几种方法,包括:

  1. 移除背景的各种方法我看到您使用了cv2.createBackgroundSubtractorMOG2(),但更简单的方法可能会产生更好的结果。当帧中没有鱼时,尝试取几十帧的平均值,然后从所有帧中减去平均背景值。如下所示:background=(A+B+C)/3其中A、B和C是没有fish的背景帧/矩阵。现在您可以简单地用减法从所有帧中移除背景。此外,可以尝试从当前帧中减去前1帧(或多帧)以突出显示帧之间的更改(实际上是时间导数)。这可以在一个循环中完成。在
  2. 沿行和列求和列和行投影是在图像中突出显示高对比度区域的一种非常简单的方法。假设(如果暗值>亮值)列将鱼位于图像中间的图像求和得到一个高斯型矢量,峰值索引对应于图像的中间列(见下图)。这也给了你一个方法来估计鱼的大小,通过注意高斯向量的宽度。在

enter image description here

请注意,列和向量上的初始高值是照明条件的结果,可以通过背景移除进行修正(参见步骤1)。在

在python中的numpy包中,您可以使用以下内容执行列求和:

^{1}$

其中M是当前图像/矩阵/感兴趣的帧。在

相关问题 更多 >