Processing javaCVを使ってcannyエッジ検出

Post date: May 23, 2013 2:12:59 PM

processingにて、javacvProというprocessing用のライブラリではなく、

普通にjavaライブラリのjavacvが叩けたのでメモ。

~~~導入~~~

javaCVをダウンロード→https://code.google.com/p/javacv/

2013/5/23現在ではjavacv-0.5-bin.zipをダウンロード、中に入っていたjarファイルをすべてテキトーにprocessingファイルのcodeフォルダに保存

OpenCVをダウンロード展開。現時点ではopencv2.4.5使用。

システム環境設定でpath「~\opencv\build\x86\vc10\bin」を追加?

何故かしんないけど、やらなくても俺のMacだとできた。よくわかんない。

でもどう考えても必要なきがする。

processingの32bit版を用意。(javacvが32bitのため。多分)

次のコードを記述すればエッジ検出は可能!

import static com.googlecode.javacv.cpp.opencv_core.*;

import static com.googlecode.javacv.cpp.opencv_imgproc.*;

import static com.googlecode.javacv.cpp.opencv_highgui.*;

CvCapture cam;

void setup ()

{

size(640*2, 480);

cam=cvCreateCameraCapture(1);

if (cam==null) {

exit();

while (true);

}

}

void draw() {

IplImage image = cvQueryFrame(cam);

// 取ってきた画像を画面に表示

if (image == null)return;

PImage img=cvtPImage(image);

IplImage gray = IplImage.create(img.width, img.height, IPL_DEPTH_8U, 1);

cvCvtColor(image, gray, CV_RGB2GRAY);

//cvSmooth( gray, smooth, CV_BLUR, 9, 9, 2, 2);

cvThreshold(gray, gray, (mouseX%640)*255/640, 255, CV_THRESH_BINARY);

double lowth=50, highth=150;

cvCanny( gray, gray, 50, 200, 3);

PImage gimg=cvtPImage(gray);

image(img, 0, 0);

image(gimg, 640, 0);

}

PImage cvtPImage ( IplImage iplImg ) {

java.awt.image.BufferedImage bImg = iplImg.getBufferedImage();

PImage img = new PImage( bImg.getWidth(), bImg.getHeight(), ARGB );

bImg.getRGB( 0, 0, img.width, img.height, img.pixels, 0, img.width );

img.updatePixels();

return img;

}

void exit() {

cvReleaseCapture( cam );

super.exit();

}

エッジ検出本体のプログラムは説明はしないが、すこし、気になる部分だけ。

別にvoid draw使わずにvoid setupにwhile(true)突っ込んだほうがopencvらしく成るんだろうけど、

こっちのほうがsleepとか入れる必要がないし、いいと思う。

しかし、終了時にメモリの開放を行う必要が有るため、exit()関数をオーバーライドして無理やり開放している。

setupの中のif (cam==null) {exit();while (true);}のwhile(true);が謎だと思う方もいるかもしれないが、

なぜかexit()入れてるのに動作が少しの時間だけ行われている場合があるみたいなので入れてみた。

なぜかcvSmooth命令がないとかいうので一旦コメントアウトしている。

ちなみに実行ボタンを押すとコンソールにエラーが次のようにでる。

No library found for static com.googlecode.javacv.cpp.opencv_core

No library found for static com.googlecode.javacv.cpp.opencv_imgproc

No library found for static com.googlecode.javacv.cpp.opencv_highgui

でもなぜか動く。

また、プログラム終了時、「Could not run the sketch.」と出る。動いたのに。謎。