1. 程式人生 > >Python在視訊處理上的優勢有哪些

Python在視訊處理上的優勢有哪些

今天與大家分享一些Python處理視訊的一下經驗,視訊的處理和圖片的處理類似,只不過視訊處理需要連續處理一系列圖片。


一般有兩種視訊源,一種是直接從硬碟載入視訊,另一種是獲取攝像頭視訊。

一共這幾個模組:

class videoReader 讀取視訊

class videoFramesExtractor(videoReader):繼承了讀取視訊,主要是用來限制讀取視訊中的哪些幀,並儲存。

read_excel_single(excel_path,event_instance): 處理Excel中的陣列,找到事件的幀數範圍:

Excel內容是這樣的,需要的只是第二列的幀範圍,另外第二列中的這些值還有重複的所以需要去除重複:

每一個範圍,例如:23450:23461之內的幀要存放在一個資料夾裡。

  1. </pre><pre name="code" class="python"># -*- coding: cp936 -*-  
  2. import cv2.cv as cv  
  3. import os  
  4. import cv2  
  5. import numpy  
  6. import Image  
  7. import xlrd  
  8. class videoReader:  
  9.     frame_count=0  
  10.     def __init__(self,videoPath):  
  11.         self.videoPath=videoPath  
  12.     def video_init(self):  
  13.         self.capture = cv.CaptureFromFile(self.videoPath)  
  14.         self.win_name = "test"  
  15.         cv.NamedWindow(self.win_name, cv.CV_WINDOW_AUTOSIZE)  
  16.     def read(self):  
  17.         self.video_init()  
  18.         while 1:  
  19.             self.frame_count+=1  
  20.             image = cv.QueryFrame(self.capture )  
  21.             cv.ShowImage(self.win_name, image)  
  22.             print self.frame_count  
  23.             c = cv.WaitKey(10)  
  24.             if c == 27:  
  25.                 break  
  26.         cv.DestroyWindow(self.win_name)  
  27. class videoFramesExtractor(videoReader):  
  28.     save_path='d:/'  
  29.     def __init__(self,videoPath,frameSpan,image_prefix):#image_prefix=event_name  
  30.         videoReader.__init__(self,videoPath)  
  31.         self.frameSpan=frameSpan  
  32.         self.image_prefix=image_prefix  
  33.     def read(self):  
  34.         capture = cv2.VideoCapture(self.videoPath)  
  35.         win_name = "test"  
  36.         cv.NamedWindow(win_name, cv.CV_WINDOW_AUTOSIZE)  
  37.         success,frame = capture.read()  
  38.         init_row=0  
  39.         while success:  
  40.             self.frame_count+=1  
  41.             success,frame = capture.read()  
  42.             #cv2.imshow(win_name,frame) #顯示照片浪費時間  
  43.             time_duration=self.frameSpan[init_row][1]-self.frameSpan[init_row][0]+1  
  44.             if self.frame_count>=self.frameSpan[init_row][0] and \  
  45.               self.frame_count<=self.frameSpan[init_row][1] :  
  46.                 self.image_save(frame,init_row,time_duration)  
  47.                 if self.frame_count==self.frameSpan[init_row][1]:  
  48.                     init_row+=1  
  49.                 if init_row==len(self.frameSpan):  
  50.                     cv.DestroyWindow(win_name)  
  51.                     return 0  
  52.             c = cv.WaitKey(10)  
  53.             if c == 27:  
  54.                 break  
  55.         cv.DestroyWindow(win_name)  
  56.     def image_save(self,frame,init_row,time_duration):  
  57.         save_path=self.make_folder(init_row,time_duration)  
  58.         #frame=Image.fromarray(frame)  
  59.         #frame.resize((300,300))  
  60.         #frame.save('%s//%s.jpg' % (save_path,self.frame_count))  
  61.         frame=cv2.resize(frame,(300,300))#  
  62.         cv2.imwrite( '%s//%s.jpg' % (save_path,self.frame_count), frame)  
  63.     def make_folder(self,init_row,time_duration):  
  64.         temp= self.image_prefix+'_'+str(init_row)+'_'+str(time_duration)#事件名稱_事件順序_  
  65.         new_path = os.path.join(self.save_path,temp)  
  66.         if not os.path.isdir(new_path):  
  67.             os.makedirs(new_path)  
  68.         return new_path  
  69. def read_excel_single(excel_path,event_instance):  
  70.         data=[]  
  71.         data=xlrd.open_workbook(excel_path)  
  72.         #read the first sheets  
  73.         table = data.sheets()[0]  
  74.         #read the num fo cols  
  75.         nrows = table.nrows  
  76.         rowmsg=[]#用來儲存幀的範圍,及事件的類別,描述。  
  77.         for i in xrange(nrows):  
  78.             start_frame,end_frame=table.row_values(i)[1].split(':')  
  79.             rowmsg.append([int(start_frame),int(end_frame),table.row_values(i)[3]])  
  80.         rowmsg.sort(lambda x,y:cmp(x[0],y[0]))#按照數字大小排序~  
  81.         event_id=[]  
  82.         event_id=event_instance  
  83.         #print event_id  
  84.         event=[]  
  85.         for item in xrange(len(rowmsg)):  
  86.             if rowmsg[item][2]==event_id:#  
  87.                 event.append(rowmsg[item])  
  88.         if event==[]:  
  89.             print ("there is no %s occurs" % event_instance)  
  90.             return 0  
  91.         #去除重複  
  92.         cur_pos=1  
  93.         new_rowmsg=[]  
  94.         pre_s=event[0][0]  
  95.         pre_e=event[0][1]  
  96.         cur_s=event[cur_pos][0]  
  97.         cur_e=event[cur_pos][1]  
  98.         while cur_pos<len(event)-1:   
  99.             while not (cur_s>pre_e):  
  100.                 if cur_s>pre_s:  
  101.                     cur_s=pre_s  
  102.                 if cur_e<pre_e:  
  103.                     cur_e=pre_e  
  104.                 still_pos=[cur_s,cur_e,event_id]  
  105.                 cur_pos+=1  
  106.                 if cur_pos==len(event)-1:  
  107.                     break  
  108.                 pre_s=cur_s  
  109.                 pre_e=cur_e  
  110.                 cur_s=event[cur_pos][0]  
  111.                 cur_e=event[cur_pos][1]  
  112.             new_rowmsg.append(still_pos)  
  113.             if cur_pos==len(event)-1:  
  114.                 break  
  115.             cur_pos+=1  
  116.             pre_s=cur_s  
  117.             pre_e=cur_e  
  118.             cur_s=event[cur_pos][0]  
  119.             cur_e=event[cur_pos][1]  
  120.         return new_rowmsg  
  121. excel_source='E:/08ann/dev_20071101/LGW_20071101_E1_CAM1.mpeg.xlsx'  
  122. event_instance='CellToEar'  
  123. row_msg=read_excel_single(excel_source,event_instance)  
  124. new_row=[ item[0:2] for item in row_msg ]   
  125. filename = "G:/TrecvidData/08/DEV/LGW_20071101_E1_CAM1.mpg"  
  126. videoread=videoFramesExtractor(filename,new_row,'CellToEar')  
  127. videoread.read()  

有幾點發現:

cv2.的函式輸出的資料型別基本都是numpy,而cv.不行。所以儘量在Python中使用cv2.的函式。

通過numpy轉換後的圖片會在顏色上有些失真,不過影響不大,如果是灰度圖的話則完全沒有影響。