2011年10月16日日曜日

Read m2ts videos via OpenCV

Installation
The support formats of OpenCV depend on ffmpeg. 
Thus, install 

sudo apt-get install libx264-dev yasm
git clone git://git.videolan.org/ffmpeg.git ffmpeg
cd ffmpeg
./configure
make
sudo make install

if you can play the file with ffmpeg, you can load it.


Sample code

import cv
import numpy

capture = cv.CreateFileCapture("yourvideo.m2ts")

cv.NamedWindow("Test", cv.CV_WINDOW_AUTOSIZE)
    
while 1:
    img = cv.QueryFrame(capture)
    cv.ShowImage("Test", img)
        
    c = cv.WaitKey(2)
    if c ==ord('q'):
        break

Python and OpenCV2.2



IPLImage (opencv) and Nnmpy Array converter
just copied from
http://opencv.willowgarage.com/wiki/PythonInterface

save the following code as adaptor.py

import cv
import numpy as np

def cv2array(im):
  depth2dtype = {
        cv.IPL_DEPTH_8U: 'uint8',
        cv.IPL_DEPTH_8S: 'int8',
        cv.IPL_DEPTH_16U: 'uint16',
        cv.IPL_DEPTH_16S: 'int16',
        cv.IPL_DEPTH_32S: 'int32',
        cv.IPL_DEPTH_32F: 'float32',
        cv.IPL_DEPTH_64F: 'float64',
    }

  arrdtype=im.depth
  a = np.fromstring(
         im.tostring(),
         dtype=depth2dtype[im.depth],
         count=im.width*im.height*im.nChannels)
  a.shape = (im.height,im.width,im.nChannels)
  return a

def array2cv(a):
  dtype2depth = {
        'uint8':   cv.IPL_DEPTH_8U,
        'int8':    cv.IPL_DEPTH_8S,
        'uint16':  cv.IPL_DEPTH_16U,
        'int16':   cv.IPL_DEPTH_16S,
        'int32':   cv.IPL_DEPTH_32S,
        'float32': cv.IPL_DEPTH_32F,
        'float64': cv.IPL_DEPTH_64F,
    }
  try:
    nChannels = a.shape[2]
  except:
    nChannels = 1
  cv_im = cv.CreateImageHeader((a.shape[1],a.shape[0]),
          dtype2depth[str(a.dtype)],
          nChannels)
  cv.SetData(cv_im, a.tostring(),
             a.dtype.itemsize*nChannels*a.shape[1])
  return cv_im




Sample cod: Yellow image
import cv
import numpy
import adaptor

capture = cv.CaptureFromCAM(0)#CreateCameraCapture(0)
cv.NamedWindow("Test", cv.CV_WINDOW_AUTOSIZE)
    
while 1:
    img = cv.QueryFrame(capture)
    array = adaptor.cv2array(img)
    array[:, :, 0] = 0
    
    cv.ShowImage("Test", adaptor.array2cv(array))
    
    c = cv.WaitKey(2)
    if c ==ord('q'):
        break

Compiling and Installing OpenCV 2.2 on Ubuntu

Compiling and Installing
Download source from:
http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.2/


Then apply the following modifications
https://code.ros.org/trac/opencv/changeset/5206

Then,
cd OpenCV-2.2.0
mkdir build
cd build
cmake .
make 
sudo make install


Sample python code
A sample code  to grab images and show it.
Press q to finish.


import cv


capture = cv.CaptureFromCAM(0)#CreateCameraCapture(0)
cv.NamedWindow("Test", cv.CV_WINDOW_AUTOSIZE)
    
while 1:
    img = cv.QueryFrame(capture)    
    cv.ShowImage("Test", img)
    c = cv.WaitKey(2)
    print c
    if c ==ord('q'):
        break