python: seguimiento de objetos de video en tiempo real de opencv

Función:

1. Obtenga la cámara y muéstrela en tiempo real
2. El mouse obtiene el área roi del objetivo en el primer cuadro
3. Realice un seguimiento del objetivo en tiempo real en el video.
4. Dos métodos de seguimiento de objetivos: 'meanshift', 'camshift'
5. Guardar video

import cv2 as cv
import numpy as np

global min_y,height,min_x,width

# 1代表打开外置摄像头,外置多个摄像头可依此枚举 0,1,
# 0代表电脑内置摄像头,
camera = cv.VideoCapture(0)

# 设置摄像头分辨率 1920 *1080
width = 1920
heigth = 1080
camera.set(cv.CAP_PROP_FRAME_WIDTH, width)
camera.set(cv.CAP_PROP_FRAME_HEIGHT, heigth)

# 选择目标追踪方式:
# 'meanshift':roi窗口固定不变
# 'camshift':roi窗口根据目标大小变化
TargetTrackingMode='meanshift' # 或者

# 创建保存视频的对象,设置编码格式,帧率,图片高宽等
out = cv.VideoWriter('outpy.avi',
                     cv.VideoWriter_fourcc('M','J','P','G'),
                    10,
                    (width,heigth))

# 获取第一帧
# ret为是否成功打开摄像头,true,false。
# frame为视频的每一帧图像
ret, frame = camera.read()

'''
利用鼠标移动截取感兴趣区域ROI:
OpenCV-python自带 API 可直接选择矩形区域作为ROI,
该API位于目标追踪模块,
主要是cv2.selectROI()函数
windowName:选择的区域被命名
showCrosshair:是否在矩形框里画十字线. 
fromCenter:是否是从矩形框的中心开始画
'''
roi = cv.selectROI(windowName='roi', img=frame, showCrosshair=False, fromCenter=False)
min_x, min_y, width, height = roi

# 销毁第一帧显示窗口
cv.destroyAllWindows()

# 设计目标位置(行,高,列,宽)
track_window=(min_x,min_y,height,width)

# 计算ROI区域的直方图
roi = frame[min_y:min_y+height,min_x:min_x+width]
hsv_roi=cv.cvtColor(roi,cv.COLOR_BGR2HSV)
roi_hist=cv.calcHist([hsv_roi],[0],None,[255],[0.0,255.0])
cv.normalize(roi_hist,roi_hist,0,255,cv.NORM_MINMAX)

#目标追踪 设置窗口搜索终止条件,最大迭代次数,窗口中心漂移最小值
term_crit = (cv.TERM_CRITERIA_EPS|cv.TERM_CRITERIA_COUNT,10,1)

while (camera.isOpened()):
  ret, frame = camera.read()

  # 摄像头是和人对立的,将图像左右调换回来正常显示。
  frame = cv.flip(frame, 1)

  while not ret:# 如果获取失败,结束本次循环
    break 

  # 计算直方图的反向投影
  hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)
  dst = cv.calcBackProject([hsv],[0],roi_hist,[0,255],1)

  # meanshift追踪
  if TargetTrackingMode == 'meanshift':
      ret, track_window = cv.meanShift(dst,track_window,term_crit)
      # 将追踪的位置绘制在视频上
      x,y,w,h = track_window
      img_addROI = cv.rectangle(frame,(x,y),(x+w,y+h),255,2)

  # camshift追踪
  if TargetTrackingMode == 'camshift':
      ret, track_window = cv.CamShift(dst, track_window, term_crit)
      pts = cv.boxPoints(ret)
      pts = np.int0(pts)
      img_addROI = cv.polylines(frame,[pts],True,255,2)

  # 显示图像
  cv.imshow('ImgandROI',img_addROI)
  #保存图像
  out.write(img_addROI)

  # cv.waitKey(k),其中k太小就会非常快,太大播放的就会非常慢捕获并显示一帧,按键后捕获并显示新的一帧
  # cv2.waitKey(0)  
  # 键入q 0xFF == ord('q'),键入Esc 0xFF == 27
  if cv.waitKey(25) & 0xFF == 27:
    break # 结束当前循环

camera.release()
cv.destroyAllWindows()


Supongo que te gusta

Origin blog.csdn.net/qq_45384162/article/details/129272186
Recomendado
Clasificación