使用计算机视觉(OpenCV和Python)实时检测植物茎中的水分

时间:2020-10-28 13:13:06

标签: python opencv image-processing computer-vision

我正在用压力室中的植物进行实验。我需要能够使用计算机视觉算法识别出水开始出现在茎的切口端的确切时间。对于this video-从USB显微镜拍摄的时间,大约是0:30到0:34秒之间的间隔。 我尝试使用MOG,MOG2和GMG作为背景减法器,并比较每个帧的直方图(使用卡方,bhattacharyya,相关性),寻找可能有意义的更改,但是仍然没有成功。对于这种类型的工作,还有更好的选择吗? 下面是一些代码(在朋友的帮助下完成)

import numpy as np
import sys
import time
import cv2
from matplotlib import pyplot as plt
video_filename = 'M20201022_004.mov'
capture = cv2.VideoCapture(video_filename)
#fgbg = cv2.bgsegm.createBackgroundSubtractorMOG()
fgbg = cv2.createBackgroundSubtractorMOG2()
#kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
#fgbg = cv2.bgsegm.createBackgroundSubtractorGMG()

width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
frames_per_second = capture.get(cv2.CAP_PROP_FPS)
num_frames = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))
print(' height: {}\n width: {}\n fps: {}\n num_frames: {}\n'.format(height, width,frames_per_second, num_frames))

frameCounter = 0
t = time.process_time()
dist_hist = 0 # distance between histograms
frame_hist = 0
time_hist = 0
#write file
file1 = open("resultado.txt","w") 
if not capture.isOpened():
    print("Could not open video")
    print('frameCounter: {}'.format(frameCounter))
    sys.exit(1)

while capture.isOpened():
  success, frame = capture.read()
  frameCounter += 1
  # Test for read error
  if not success:
      print('Failed to read video - Video Capture EOF or Error')
      print('frameCounter:{}'.format(frameCounter))
      if frameCounter == num_frames + 1:
          print('EOF found')
      else:
          print('error')
      break      
      #sys.exit(1)
  else:           
      if frameCounter % 1000 == 0:
          print('type:{} size:{} dtype:{} len(shape):{} contador:{}'.format(type(frame),frame.size,frame.dtype,len(frame.shape),frameCounter))

          if len(frame.shape) < 3:  # grayscale
              h, w = frame.shape
              print('h:{} w:{}'.format(h, w))
          else:                     # color image
              h, w, ch = frame.shape
              print('h:{} w:{} ch:{}'.format(h, w, ch))


      fgmask = fgbg.apply(frame)
      #fgmask = fgbg.apply(frame)
      #fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
      # Initial histogram Test
      if frameCounter == 1:
          hist_initial = cv2.calcHist([fgmask], [0],None,[16],[0, 256])
      #  print('hist_initial:{}'.format(hist_initial))
      #elapsed_time = time.process_time() - t
      elapsed_time = frameCounter / frames_per_second
      # Process Histogram  
      hist_process = cv2.calcHist([fgmask], [0],None,[16],[0, 256])
     
      dist = cv2.compareHist(hist_initial, hist_process,cv2.HISTCMP_CHISQR)

      str1 = str(frameCounter) + "," + str(dist) + "," + str(dist_hist) + "," + str(elapsed_time)
      file1.write(str1)
      file1.write("\n") 

      if dist > dist_hist:    # Depending on compareHist method 
            dist_hist = dist
            time_hist = elapsed_time
            frame_hist = frameCounter

      # Print line at image
      strfmt = 'frame: {} elapsed_time: {:7.2f}'.format(frameCounter, elapsed_time) 

      cv2.putText(frame, strfmt, (0, 50),cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0,0,255), 1, cv2.LINE_AA)
      cv2.imshow('frame', frame)
      cv2.imshow('fgmask', fgmask)
      if cv2.waitKey(1) & 0xff == 27:  # ESC pressed
          break

print('---> frame:{} dist:{:10.6f} time:{:7.2f}'.format(frame_hist, dist_hist,time_hist))
capture.release()
cv2.destroyAllWindows()
file1.close()

任何帮助表示赞赏!

0 个答案:

没有答案
相关问题