2012/07/27

BeagleBoneタンク バスパワー不足?

Webカメラの画像送信サーバーと、キャタピラ操作サーバーを作ったので実際にタンクにBeagleBone、モータードライバー、USB電源を載せて動かしてみました。

電源、BeagleBone,モータドライバ

最初はカメラの画像も取得できたのですが、コマンドを送信してキャタピラを動かし始めるとカメラの画像が取得出来なくなり、無線LANも途切れてしまいました。

BeagleBoneにはUSBポートが1つしかないため、バスパワー駆動のUSB HUBを経由して接続しましたが、それがよくないのかもしれません。ネットで調べてみると、HUBに無線LANアダプタを挿すと動作しないことがよくあるようです。

試しにHUBを使わず、無線LANアダプターだけを挿したら問題なく通信出来ました。やはり電力が足りてないようです。





改良すべき点

  • バスパワー駆動HUBだと電力が足りないっぽい。セルフパワーのHUBにしてみる
  • BeagleBoneを出力2Aのポートにつないでいるが、2Aをやめて0.5Aのポートにつなぎ替え、2AのポートはセルフパワーHUBの電源とする。
  • セルフパワーHUBの電源コネクタをUSB電源対応に改造する。
  • 無線LAN経由だと命令の遅延が発生するので、コマンドに移動量(10センチ進むとか45度右に回転とか)を組み込む必要がある。今の状態では無線LANが途切れたらずーっと走り続けてしまうため。


”よちよち歩き”状態のBeagleBoneタンク。
重心が高いのでちょっとした段差も危ない感じです。




もう少し本体&コードを改良してから、ソースコードをGitHubのほうにアップしたいと思います。

ではまた。

2012/07/22

python-opencv tutorial(5)

python-opencvチュートリアル(5)

今回は文字列の書き込みとマウスイベントの処理です。

GitHubリポジトリ
https://github.com/kyatou/python-opencv_tutorial

文字列の書き込み
'''
python-opencv tutorial
Annotate message to image.
Usage:
  09_annotate.py imagename
'''

import cv2
import sys

argvs=sys.argv
if (len(argvs) != 2):
    print 'Usage: # python %s imagefilename' % argvs[0]
    quit()
 
imagefilename = argvs[1]
try:
     img=cv2.imread(imagefilename, 1)
except:
     print 'faild to load %s' % imagefilename
     quit()


#putText(...)
#    putText(img, text, org, fontFace, fontScale, color[, thickness[, linetype[, bottomLeftOrigin]]]) -> None

msg='HELLO,OpenCV!'
location=(0,30)

fontface=cv2.FONT_HERSHEY_PLAIN
fontscale=1.0
color=(255,190,0) #sky blue
cv2.putText(img,msg,location,fontface,fontscale,color)


#big size
fontscale=2.0
location=(0,img.shape[0]/2)
thickness=2
cv2.putText(img,msg,location,fontface,fontscale,color,thickness)

cv2.imshow('Annotated Image',img)
cv2.waitKey(0)
cv2.destroyAllWindows() 
                    


文字列の書き込み


マウスイベントの処理

'''
python-opencv tutorial
Example of mouse callback
draw a circle or rectangle to clicked point.

Usage:
  10_mouse_callback.py imagename
'''

import cv2
import sys

argvs=sys.argv
if (len(argvs) != 2):
    print 'Usage: # python %s imagefilename' % argvs[0]
    quit()
 
imagefilename = argvs[1]
try:
     img=cv2.imread(imagefilename, 1)
except:
     print 'faild to load %s' % imagefilename
     quit()

usage='left click to draw a circle.\nright click to draw a rectangle.\n'
usage=usage+'press any key to exit.'
print(usage)



windowName="mouse"
cv2.namedWindow(windowName)
  
def onMouse(event, x, y, flags, param):
     """
        Mouse event callback function.
        left click -> draw circle
        right click -> draw rectangle
     """ 
     if event == cv2.EVENT_MOUSEMOVE:return 
 
     if event == cv2.EVENT_LBUTTONDOWN:
         center=(x,y) 
         radius=10
         color=(255,255,0)
         cv2.circle(img,center,radius,color)
     
     if event == cv2.EVENT_RBUTTONDOWN:
         rect_start=(x-10,y-10)
         rect_end=(x+10,y+10)
         color=(100,255,100)
         cv2.rectangle(img,rect_start,rect_end,color)

     cv2.imshow(windowName,img)


#setMouseCallback(...)
#    setMouseCallback(windowName, onMouse [, param]) -> None
cv2.setMouseCallback(windowName,onMouse)

cv2.imshow(windowName,img)
cv2.waitKey(0)
cv2.destroyAllWindows() 

マウスイベントの処理

ではまた。

2012/07/21

BeagleBoneタンク モータ制御

BeagleBoneタンクのモーター制御を行うために、モータードライバを使用するのですが、モータードライバごとに前進・後退・停止の3通りの信号を入力しなければなりません。
BeagleBoneは約60本のGPIOピンを持っているので、モータードライバごとに2本のGPIOピンを使用して制御信号を送ります。



GPIOピンを使用するには、
  • ピンのモードを変更する(omap_mux)
  • ピンをexportする
  • 入出力の方向を決める
  • 出力・入力を行う
という手順をピンごとに行う必要があります。
毎回手順を実行するのは面倒なため、GPIO操作用のクラスを作りました。
ソースコードはGithubに保存してあります。


I use motor driver IC (TOSHIBA TA7291P) to control the BeagleBone tank.
Motor driver needs two control signal. Because beaglebone has many GPIO pins, I use it to control each motor driver.

To use GPIO pin on Ubuntu , we have to do below step per each pin.
  • change omap_mux
  • export pin
  • decide signal direction
  • input/output signal
It is time-consuming steps to do by hand, so I made  a GPIO helper class.


Github:



GPIOが手軽に操作できるようになったので、beagleboneクラスを使用してBeagleBoneTankDriverクラスを作りました。
ひとまず前進、後退、左回転、右回転を実装しています。今のところ与えた命令を何秒も実行する形になっているので、タイマーをつけて一定時間経過後は停止するように変えたほうが良いかもしれません。









あとは移動コマンドを送受信するコードを作れば、ひとまず動く形になると思います。
ではまた。

2012/07/20

Webカメラの画像をpythonのsocketを使って転送する

BeagleBoneタンクに欠かせない装備はWebカメラです。Webカメラの映像をコマンドセンター(自分の部屋)にて確認し、状況に応じた適切な命令をタンクに送ることがでるようになります。

タンクとコマンドセンター間は無線LANで繋ぐので、ソケットを使って画像を転送する必要があります。Cでソケットプログラムを書くのは面倒ですが、pythonにはラッパークラスがあって比較的簡単にソケットプログラミングができます。

Webカメラで取得した画像の送信フローは以下のとおりです。
タンクはコマンドセンターから画像要求が来た場合に、Webカメラで取得した画像をJPEGに圧縮して送り返します。コマンドセンターでは受信した画像をデコードし、画面に表示します。受信しているデータはJPEGなので、そのままJPEGファイルとしてディスクに書き込むことも可能です。


SocketServerモジュールのサンプルコードを元に、BeagleBoneタンクで画像を取得し、コマンドセンターに転送するプログラムを作りました。例外処理等はしてませんが、一応動いています。タンク側はCtrl+cの強制終了でしか終わらないので行儀良いプログラムではありません。そのうち改良しようと思います。


はじめはOpenCV2.4から実装されているcv2.imencodeとcv2.imdecodeを使っていたのですが、BeagleBone側はOpenCV2.3だという事に気づき、エンコードにcv2.cv.EncodeImageを使用しています。OpenCV2.3のcv2.imencodeはSegmentation faultが出たので使うのをやめました。

まだ有線LANでしか実験していませんが、QVGAサイズの画像を1秒間に5枚程度は送受信できています。無線に変えても2〜3枚は送受信できるかな・・・?


BeagleBoneタンク側:
"""
 webcamera server
  for opencv 2.3
"""

import SocketServer
import cv2.cv as cv
import numpy
import socket
import sys

#for OpenCV2.3 python interface

class TCPHandler(SocketServer.BaseRequestHandler):
    capture=''

    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        print "%s connected:" % self.client_address[0]
        frame=cv.QueryFrame(capture)

        jpegstring=cv.EncodeImage('.jpeg',frame).tostring()
        print len(jpegstring)
        self.request.send(jpegstring)


if __name__ == "__main__":
    HOST, PORT = '192.168.111.40', 12345

    #init camera
    cameraid=0
    capture=cv.CreateCameraCapture(0)
    cv.SetCaptureProperty(capture,cv.CV_CAP_PROP_FRAME_WIDTH,320)
    cv.SetCaptureProperty(capture,cv.CV_CAP_PROP_FRAME_HEIGHT,240)
    if not capture:
        print "Could not open camera"
        exit()
  
    server = SocketServer.TCPServer((HOST, PORT), TCPHandler)

    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C
    server.capture=capture
    server.serve_forever()


コマンドセンター側
'''
  Image receiver
  for OpenCV 2.4 python interface
'''

import socket
import sys
import numpy
import cv2

# for opencv 2.4.2

HOST, PORT = "192.168.111.40", 12345

# Receive data from the server and shut down
quitflag=False
recvlen=1

def getImageFromServer():
    sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.connect((HOST,PORT)) 
    sock.send('HELLO\n')
    recvlen=100
    buffer='' 
    while recvlen>0:
        receivedstr=sock.recv(1024*8)
        recvlen=len(receivedstr)
        buffer +=receivedstr

    print '%d bytes received' %len(buffer)
    narray=numpy.fromstring(buffer,dtype='uint8')
    decimg=cv2.imdecode(narray,1)
    sock.close()
    return decimg

while 1:
    img=getImageFromServer()
    cv2.imshow('Capture',img)
    key=cv2.waitKey(100)
    if(int(key)>27): break
    img=''


※IPアドレスとポートは適当に読み替えてください。



次はソケットで操縦コマンドを送受信してGPIOを制御する部分を作ろうと思います。
ではまた。

2012/07/18

BeagleBoneタンク ソフトウェア設計

ハードウェアはだいたい揃ってるので、ソフトウェアの設計にかかります。

今回メインで使う言語は練習もかねてpythonにしました。

今回のシステムのざっくりとした設計は以下の通りです。
BeagleBoneとPC間は無線LANで接続します。TCP/IPが使えれば何でもOKです。
データ転送ですが、FTPのように制御コマンドとデータを別々のソケットで扱うことにしました。pythonにはserversocketというライブラリがあるようなので、Cとかでソケットを扱うよりかは簡単に作業できると思います。

制御コマンドは前進、後退、左旋回、右旋回、ストップの5つぐらいにして、必要に応じて追加していきたいと思います。BeagleBone側で制御コマンドを受信したら、GPIOを操作してモータードライバの出力方向を切り替える予定です。ただ、GPIOの出力が3.3V、モータードライバの最低入力電圧(HIGH)が3.5Vとなっているので、電圧レベル変換の回路をつける必要はありそうです。

ひとまずpythonのサーバソケット・クライアントソケットのプログラムと、GPIOで前進・後退のプログラムを作って、モータードライバではなくLEDをつないでテストしてみたいと思います。

ではまた。

python-opencv tutorial(4)

python-opencvチュートリアル その4


GitHubリポジトリ
https://github.com/kyatou/python-opencv_tutorial


今日はROIの設定と、画像のエンコード・デコードです。

画像全体に処理を行うと時間がかかるので、特定の領域(ROI)を作成してROIだけに処理を行うと処理時間の短縮が可能になります。


'''
python-opencv tutorial
Create image ROI(Region of Interest)
Usage:
    07_image_roi.py imagename
'''

#import opencv library
import cv2
import sys
import numpy

argvs=sys.argv
if (len(argvs) != 2):
    print 'Usage: # python %s imagefilename' % argvs[0]
    quit()
 
imagefilename = argvs[1]
try:
    img=cv2.imread(imagefilename, 1)
except:
    print 'faild to load %s' % imagefilename
    quit()

imgshape=img.shape
roiWidth=imgshape[1]/4
roiHeight=imgshape[0]/4
sx=imgshape[1]/2-roiWidth
sy=imgshape[0]/2-roiHeight
ex=imgshape[1]/2+roiWidth
ey=imgshape[0]/2+roiHeight

#extract roi as array
roi=img[sy:ey,sx:ex]

#invert roi area
img[sy:ey,sx:ex]=cv2.bitwise_not(roi)

cv2.imshow('roi image',img)
cv2.waitKey(0)
cv2.destroyAllWindows() 
                




画像のエンコード・デコードは、OpenCVの画像形式のものを他のアプリケーションでも読める形式(jpeg,pngなど)に 変換したり、その逆を行う作業です。ファイルに保存する場合はimwriteを使いますが、メモリ上に格納したい時はimencodeを使用します。例えばWebカメラ画像をキャプチャして、ネットワーク経由で他のPCに転送して表示したかったりするときにエンコード・デコードがあると便利です。

'''
python-opencv tutorial
Encode and decode image data.
Usage:
  08_image_encode_decode.py imagename 
'''

#import opencv library
import cv2
import sys
import numpy

argvs=sys.argv
if (len(argvs) != 2):
    print 'Usage: # python %s imagefilename' % argvs[0]
    quit()
 
imagefilename = argvs[1]
try:
     img=cv2.imread(imagefilename, 1)
except:
     print 'faild to load %s' % imagefilename
     quit()


#encode to jpeg format
#encode param image quality 0 to 100. default:95
#if you want to shrink data size, choose low image quality.
encode_param=[int(cv2.IMWRITE_JPEG_QUALITY),90]
result,encimg=cv2.imencode('.jpg',img,encode_param)
if False==result:
    print 'could not encode image!'
    quit()

#decode from jpeg format
decimg=cv2.imdecode(encimg,1)

cv2.imshow('Source Image',img)
cv2.imshow('Decoded image',decimg)
cv2.waitKey(0)
cv2.destroyAllWindows() 


ではまた。

2012/07/16

BeagleBoneタンク作成開始

半年ぐらい前にBeagleBoard-xmとArduinoを使って、無線タンクをつくろうとしましたが、途中で面倒になってしまったので放置してました。



BeagleBoneが手に入ったので、これでBeagleBoneタンクを作ってみようと思います。

材料
  • BeagleBone (ubuntu12.04)
  • Webカメラ(ロジクール C210)
  • 無線LANアダプタ(I-Oデータ WN-G150U)
  • USB電源(日立マクセル MLPC-4000)
  • タンク工作基本セット
  • ユニバーサルプレートセット
  • ユニバーサルアームセット

Webカメラは安くて小さいやつ、ということでC210を選びました。
モニタに固定するためのアームのような部分があるのですが、そこをラジオペンチなどで取り外すとユニバーサルアームセットにある軸受パーツがちょうどいい感じで挟まることがわかりました。結束バンドとかで固定しようと思っていたのですが、思わぬ収穫です。


 電源のほうですが、マクセルのmobile Voltageというのを選びました。USBポートの出力電流が最大2.1Aとなっていたからです。また、本体が薄いのもポイントでした。
 

無線LANのアダプタはI-O DATAの前にPCIのGW-USValue-EZを試していたのですが、PCIのはダメでした。このアダプタはWifi機器をつなぐ機能も付いているのですが、その辺がよくないのかもしれません。純粋な無線LAN子機のものを選んだほうが良さそうです。

BeagleBoneにmjpg-streamerをインストールして、無線LAN経由でWebカメラの画像が見えるところまで確認出来ました。
あとはBeagleBoneのGPIOとモータードライバをつなげればWebカメラ付きラジコンができそうな感じです。


2012/07/15

python-opencvチュートリアル(3)

python-opencvチュートリアルその3


GitHubにリポジトリを作ってみました
https://github.com/kyatou/python-opencv_tutorial



今日はガウシアンピラミッドの作成とWebカメラからの画像取り込みです。

ガウシアンピラミッド
800x800ピクセルの画像を作成し、半分のサイズ、4分の1のサイズのものを作成します。

'''
python-opencv tutorial
Make gaussian pyramid
Usage:
 05_GaussianPyramid.py
'''

#import opencv library
import cv2
import numpy

imgwidth=800
imgheight=800
img_original= numpy.zeros((imgheight,imgwidth,1),numpy.uint8)

#draw some circle
for i in range(1,6):
 cv2.circle(img_original,(20*2**i,20*2**i),i*10,(255,255,255),2)

#pyrDown(...)
#   pyrDown(src[, dst[, dstsize[, borderType]]]) -> dst

#make half size and quater size
img_half=cv2.pyrDown(img_original)
img_quat=cv2.pyrDown(img_half)

cv2.imshow('original',img_original)
cv2.imshow('Half size',img_half)
cv2.imshow('Quater size',img_quat)

cv2.waitKey()
cv2.destroyAllWindows() 



Webカメラからの画像取り込み

'''
python-opencv tutorial
Get image from web camera
Usage:
 06_webcamera.py
'''

#import opencv library
import cv2


#VideoCapture(...)
#      VideoCapture() -> 
#  or  VideoCapture(filename) -> 
#  or  VideoCapture(device) -> 

#get capture object
cameraid=0
capture=cv2.VideoCapture(cameraid)

isopen=capture.isOpened()
if(False==isopen):
    #retry to open camera
    capture.open(cameraid)
    isopen=capture.isOpened()
    if(False==isopen):
        #could not open camera...
        print 'Could not open camera.' 
 exit()

#get camera attribute
imwidth=capture.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)
imheight=capture.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)
print 'img width %d height %d ' % (imwidth,imheight)

print 'press ESC or q to quit'

#capture image and display to monitor
while True:
    ret,frame=capture.read()
    if not ret:
        print 'Could not capture frame.'
        exit()

    cv2.imshow('Captured Frame',frame)
    inputkey=cv2.waitKey(100)
    c=chr(inputkey & 255)
    if c in ['q',chr(27)]:
 break

#release capture
if(capture.isOpened()):
    capture.release()

cv2.destroyAllWindows() 






ではまた。

2012/07/12

python-opencvチュートリアル(2)

python-opencvのチュートリアル その2。
今日はトラックバーの付け方とガウシアンフィルタの掛け方です。

OpenCV 2.4.2で動作確認しています。

トラックバー


"""python-opencv tutorial
Create trackbar control.

Usage:
        03_trackbar.py
"""

#import opencv library
import cv2
import numpy

#Trackbar callback function
def onTrackbarChange(trackbarValue):
    imgshape=fullcolorimage.shape
    fimg=numpy.zeros(imgshape,numpy.uint8)
    colorval=trackbarValue*10
    diff=trackbarValue*10
    xcenter=imgshape[1]/2
    ycenter=imgshape[0]/2
    color=(colorval,colorval,colorval)
    cv2.rectangle(fimg, (xcenter-diff, ycenter-diff), (xcenter+diff, ycenter+diff), color, -1)
    cv2.imshow(windowName, fimg)

imgwidth=640
imgheight=480
fullcolorimage = numpy.zeros((imgheight,imgwidth,3),numpy.uint8)

windowName="TrackbarSample"
cv2.namedWindow(windowName)
onTrackbarChange(0)

#createTrackbar(...)
#    createTrackbar(trackbarName, windowName, value, count, onChange) -> None
cv2.createTrackbar( 'Trackbarname', windowName, 0, 25, onTrackbarChange )

cv2.waitKey()
cv2.destroyAllWindows()




ガウシアンフィルタの例

"""
python-opencv tutorial
Gaussian filter sample script.
Usage:
        04_smooth.py imagename
"""

#import opencv library
import cv2
import sys
import numpy

argvs=sys.argv
if (len(argvs) != 2):
    print 'Usage: # python %s filename' % argvs[0]
    quit()


imagefilename = argvs[1]
try:
        img=cv2.imread(imagefilename, 1)
except:
        print 'faild to load %s' % imagefilename
        quit()

#GaussianBlur(...)
#    GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) -> dst
# ksize must pair of odd. (5,5),(7,7),(9,9)...
bluredimg=cv2.GaussianBlur(img,(11,11),0)

cv2.imshow('Gaussian',bluredimg)
cv2.imshow('Source',img)

cv2.waitKey(0)
cv2.destroyAllWindows()


以前はcvSmoothの引数でCV_GAUSSIAN的なものを指定していたのですが、ガウシアンが独立した関数になったようですね。

チュートリアルが貯まってきたらgitHubかどこかにあげようかな〜と思います。
ではまた。

2012/07/10

Pro Git 日本語版PDFの生成

ソースコード管理システムのGitのドキュメントとして、Scott Chacon氏のPro Gitという書籍があります。この書籍は紙と電子データの2通りあり、原稿データはgitにアップされています。原本は英語ですが、日本語など他の言語にも翻訳されています。

この本はPDF形式やMobi形式に変換できるようなので、変換してみました。

git clone git://github.com/progit/progit.git
sudo apt-get install rake
sudo apt-get install texlive texlive-latex-extra texlive-xetex pandoc
sudo apt-get install ttf-vlgothic
./makepdfs ja

これでPDFファイルができました。次にmobiファイルも作ります。

sudo apt-get install calibre
./makeebooks ja

mobiファイルができましたが、画像が入っていません。
makeebooksファイルの画像パスを変換している部分の正規表現を

 content.gsub!(/Insert\s+(.*)(\.png)\s*\n?\s*#{figure_title}?\s+(.*)/, '![\3](figures/\1-tn\2 "\3")')
から
 content.gsub!(/Insert\s+(.*)(\.png)\s*\n?\s?(.*)\s?/, '![\3](figures/\1-tn\2 "\3")')
に書き換えました。

これでもう一度作成すると、画像入りのmobiファイルができました。
日本語対応版のkindleにmobiを入れて表示させたところ、無事読めるようになりました。図表番号は入っていませんが、まぁ良しとしましょう。



今回作ったPDFファイルとMobiファイルは、別館に置いてあります。
紙の方がよい方は、Amazonなどで購入できます。

ではまた。

2012/07/09

python-opencvチュートリアル

OpenCV2.4.2のサンプルコードを眺めていると、pythonのサンプルコードが増えていることに気がつきました。エッジ検出や顔検出のサンプルコードを動かして見たところ、サクサク動いたのでスクリプトだから遅くなるという訳ではないようです。

python2のフォルダにあったサンプルで、エラーが出なかったコードの一覧は以下のとおり。

browse.py  4096x4096の画像を縮小したものの一部にカーソルを当てると、その部分が拡大される。マウスイベントのサンプル?
calibrate.py カメラのキャリブレーション
color_histogram.py 色ごとのヒストグラム。
contours.py 輪郭検出
digits.py SVNを使った手書き文字認識。認識できなかったものを赤く表示?
digits_video.py Webカメラで撮影した画像から文字認識。処理の速さと認識率にびっくり
edge.py webカメラ画像の輪郭検出
feature_homography.py 2つの画像間の特徴点を比較して、ホモグラフィ行列を計算する。特徴点を検出している割にはかなり速い
fitline.py 複数のフィッティング手法を切り替えてラインフィッティング
gaussian_mix.py ランダムな点列をグループ化
kmeans.py k-meanによるクラスタリング。よくわかりません
lappyr.py ラプラシアンピラミッドによる画像フィルタ。どういう効果があるのかは分かりません
lk_homography.py オプティカルフローによる追跡
motempl.py 動体検知
mser.py 領域分割。 自動塗り絵とかに使えそう
opt_flow.py オプティカルフロー
turing.py 同じものを敷き詰めてもつなぎ目が分からないランダムな画像を生成
video.py スペースを押したらWebカメラの画像のキャプチャを保存する
video_dmtx.py Matrixコードを読み込む
video_threaded.py マルチスレッドによる動画処理



BeagleBoneのGPIO制御もpythonでやることにしたので、練習がてらpython-opencvのチュートリアルを作ってみることにしました。BeagleBoneにWebカメラをつないで、サーボを使って追尾システムとか作れるぐらいになれればいいな~と思っています。



チュートリアル00 画像の読み込み
'''
python-opencv tutorial
Load image file from disk.
Usage:
 00_loadImage.py imagefile
'''

#import opencv library
import cv2
import sys

argvs=sys.argv
if (len(argvs) != 2):
    print 'Usage: # python %s filename' % argvs[0]
    quit()

imagefilename = argvs[1]
try:
    img=cv2.imread(imagefilename, 1)
except:
    print 'faild to load %s' % imagefilename
    quit()

#show image
windowName= 'LoadImage'
cv2.imshow(windowName, img)
print 'Press any key to exit.'

cv2.waitKey(0)

チュートリアル01 リサイズと色変換
'''
python-opencv tutorial
Resize image to half size and
convert to gray scale image.
Usage:
    01_resize_and_convertColor.py imagefile
'''

#import opencv library
import cv2
import sys

argvs=sys.argv
if (len(argvs) != 2):
    print 'Usage: # python %s filename' % argvs[0]
    quit() 

imagefilename = argvs[1]
try:
    img=cv2.imread(imagefilename, 1)
except:
    print 'faild to load %s' % imagefilename
    quit()

#define small image size
imgsize=img.shape

#imgsize = (height,width,depth)

simg_width=imgsize[1]/2
simg_height=imgsize[0]/2

#half size image and grayscaled image
simg=cv2.resize(img,(simg_width,simg_height))
gimg=cv2.cvtColor(simg,cv2.COLOR_BGR2GRAY)

cv2.imshow('Half size',simg)
cv2.imshow('Grayscaled',gimg)

print 'Press any key to exit.'
cv2.waitKey(0)



ではまた。

2012/07/07

Ubuntu12.04にOpenCV2.4.2をインストール

Ubuntu11.10から12.04にアップグレードインストールしたのですが、「コンピュータにエラーが見つかりました」というメッセージが起動時に出るようになりました。毎回出るのが鬱陶しくなってきたので、Ubuntuの領域を削除し最初からインストールすることにしました。


インストールした直後のUbuntuには当然OpenCVはインストールされていないので、下記サイトを参考に、OpenCV2.4.2をインストールしました。

Linux で OpenCV バージョン 2.4.2 のダウンロードとビルドとインストールとテスト実行

まずはOpenCV2.4.2のソースコードをダウンロードしてきて解凍しておきます。
あとは必要なライブラリのインストール。600MB程度あるので結構時間がかかりました。

sudo apt-get -yV install build-essential
sudo apt-get -yV build-dep opencv 
sudo apt-get -yV install libjpeg-dev
sudo apt-get -yV install libopenjpeg-dev
sudo apt-get -yV install jasper
sudo apt-get -yV install libjasper-dev libjasper-runtime
sudo apt-get -yV install libpng12-dev
sudo apt-get -yV install libpng++-dev libpng3
sudo apt-get -yV install libpnglite-dev libpngwriter0-dev libpngwriter0c2
sudo apt-get -yV install libtiff-dev libtiff-tools pngtools
sudo apt-get -yV install zlib1g-dev zlib1g-dbg
sudo apt-get -yV install v4l2ucp
sudo apt-get -yV install python
sudo apt-get -yV install autoconf
sudo apt-get -yV install libtbb2 libtbb-dev
sudo apt-get -yV install libeigen2-dev
sudo apt-get -yV install cmake
sudo apt-get -yV install openexr
sudo apt-get -yV install gstreamer-plugins-*
sudo apt-get -yV install freeglut3-dev
sudo apt-get -yV install libglui-dev
sudo apt-get -yV install libavc1394-dev libdc1394-22-dev libdc1394-utils
sudo apt-get -yV install libxine-dev
sudo apt-get -yV install libxvidcore-dev
sudo apt-get -yV install libva-dev
sudo apt-get -yV install libssl-dev
sudo apt-get -yV install libv4l-dev
sudo apt-get -yV install libvo-aacenc-dev
sudo apt-get -yV install libvo-amrwbenc-dev
sudo apt-get -yV install libvorbis-dev
sudo apt-get -yV install libvpx-dev

GUIでMakefileを作りたいのでGUIもインストール
sudo apt-get install cmake-gui

CMake-GUIでOpenCVのソースディレクトリとビルド用のディレクトリを指定し、Configureを押します。その後必要なライブラリやオプションを指定し(PCのグラボはATIなのでGPU関係はインストールしないことにしました)、Generateを押してmakefileを作ります。
ビルド用ディレクトリで以下のコマンドを実行します。

make -j6
sudo make install

makeの-jオプションは、同時実行するジョブの上限を指定します。
CPUのコア数と同じにするとCPUをフルに使ってビルドしてくれます。私の環境ではビルド中、6コアのCPUがほぼ100%の使用率で、完了まで10分程度でした。

さて、きちんとインストールされているか確かめるために何かサンプルを動かしてみることにします。
サンプル選びのためにsamples/cppフォルダを見てみると、ビデオカードっぽいものの基板の写真がありました。grepで検索してみると、

grep board.jpg *.cpp
houghcircles.cpp:    const char* filename = argc >= 2 ? argv[1] : "board.jpg";

houghcircles.cppがこの画像ファイルを使っているようなので、これをビルドしてみます。

まずはコンパイルだけ
gcc -c houghcircles.cpp

OK。次はそれっぽいライブラリとともにリンクします。
gcc houghcircles.cpp -o hough.o -lopencv_calib3d -lopencv_core -lopencv_highgui -lopencv_imgproc

実行ファイルができたので動かしてみます。
./hough.o


誤検出はありますが、電解コンデンサが検出されています。
問題なく動作しているようですね。


ではまた。