約 4,081,320 件
https://w.atwiki.jp/kai_raku/pages/20.html
OpenCV(Open Source Computer Vision Library)とは、Intel社が公開・提供している画像処理向けのライブラリです。 オープンソースの為、誰でも利用することができます。 画像処理で有名なDirectShowや後継のDirectXmediaよりも、簡単にプログラムを実現することができます。 OpenCVのインストール方法は→こっち
https://w.atwiki.jp/nkym_memo/pages/58.html
OpenCV
https://w.atwiki.jp/kanelab/pages/13.html
"cv099.dllがない"と言われて動かない cvReleaseImageHeaderが誤動作する メモリが "written" にならない cvCompareHistがBad argument になる 画像処理を画像の下半分に限定したい場合 画像変換まとめ #include "ipl.h" の前に #include "cv.h" を入れるとどうなるか IplImageのチャンネル数を変える Median filterが使えない ラべリングが遅い cvAndが使えない cvHaarDetectObjectsが使えない cvSaveImageが使えない3 cvSaveImageが使えない2 cvSaveImageが使えない cvConvertScaleが使えない cvConvertScaleが使えない2 cvCopyが使えない3 cvCopyが使えない2 cvCopyが使えない IplImageの開放について ImageHeaderとは? MiniBeeで画像のレクティファイが出来ない(調査中) "cv099.dllがない"と言われて動かない 1.原因 OpenCVのバージョン変更をプログラムが理解していない。 2.解決方法 (1)リンカの中間ファイルの削除 タスクバー→ビルト→ソリューションのリビルド で中間ファイルを削除しプロジェクト全体をリビルドする。 (2)開発環境の再設定 開発環境を再起動させる。 cvReleaseImageHeaderが誤動作する 1.エラーメッセージ OpenCV GUI Error Handler Unknown error code -49 (Deallocation error) in function cvFree_, C \User\VP\opencv\cxcore\src\cxalloc.cpp(129) Press "Abort" to terminate application. Press "Retry" to debug (if the app is running under debugger). Press "Ignore" to continue (this is not safe). 中止(A) 再試行(R) 無視(I) 2.現象 Bumblebee2を使った連続処理(廊下・障害物検出)において cvReleaseImageHeader( DispImageH81D ); cvReleaseImageHeader( iplDispImage ); と二つ関数が並んでいた時、デバック中上のcvReleaseImageHeader( DispImageH81D );が動作すると下の iplDispImageの中身がおかしくなる。で、その式を動作させると上記のエラーメッセージが出てくる。 DispImageH81Dと iplDispImageの順序を上下逆にすると下になったIplImageHeaderの値がおかしくなる。 3.原因 このプログラムは前回メモリリークによる連続処理の中断というバグを潰していた。その時点では問題なく動作していたのでそのあと“いらない部分”の削除を行った。その時必要な部分も削除してしまったと思われる。 4.対策 動くバージョンと動かないバージョンを見比べて必要と思われる部分の洗い出しを行う。 5.解決策 cvReleaseImageHeader( DispImageH81D );、cvReleaseImageHeader( iplDispImage );の二つをコメントアウトした。 動くバージョンでは画像の解放はほとんど行っていなかったが長時間の連続動作にも耐えられた。 ImageHeaderの解放は以前からうまくいっていなかったので今後も注意する必要がある。 メモリが "written" にならない 1.エラーメッセージ PTracker.exe - アプリケーション エラー "0x77bdb9b5" の命令が "0x7f7d7e81" のメモリを参照しました。メモリが "written" になることはできませんでした。 プログラムを終了するには [OK] をクリックしてください プログラムをデバッグするには [キャンセル] をクリックしてください OK キャンセル 2.現象 Bumblebee2を使った連続処理(廊下・障害物検出)において2フレームほど経過すると上記のエラーが発生し処理が止まる。デバッグモードにならない。"0x77bdb9b5" や "0x7f7d7e81"と言われてもどこだか分らない。 3.原因:不明 4.解決方法 直前の変更点である IplImage *planes[2]; planes[0] = h_plane = cvCreateImage (cvGetSize (src), 8, 1); planes[1] = s_plane = cvCreateImage (cvGetSize (src), 8, 1); cvReleaseImage ( planes[0]);// 解放するとメモリが読み込めなくなる cvReleaseImage ( planes[1]); のcvReleaseImageをコメントアウトした。マジでわけわからん。教訓が得られそうにないのがなおさらキツイ。 cvCompareHistがBad argument になる 1.エラーメッセージ OpenCV GUI Error Handler Bad argument (Invalid histogram header[s]) in function cvCompareHist, C \User\VP\opencv\cv\src\cvhistogram.cpp(414) Press "Abort" to terminate application. Press "Retry" to debug (if the app is running under debugger). Press "Ignore" to continue (this is not safe). 中止(A) 再試行(R) 無視(I) 2.現象 Bumblebee2を使った連続処理(廊下・障害物検出)において (1)プログラム自体は動作するがカメラを動かしたりすると(画面が激しく変化すると?)上記のエラーが出て処理が止まる。 (2)デバッグするとcvCompareHistを使っている関数などが指定される(結果的にはこれはあまり意味がなかった) (3)ただしデバッグごとにcvCalcArrHist以外の部分(「ソースコードを表示できない」と言われたこともある)が指定されたりと症状が一定しなかった。 (3)必ず特定のフレームで処理が終わった。一回の処理は通るのでデバッグモードでは解決できないタイプだった。 3.原因・解決方法 メモリの解放忘れ。 CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* lines= 0; でCV関連の構造体を定義していたが cvClearSeq(lines); cvReleaseMemStorage( storage); の解放を忘れていた。 4.まとめ・教訓 (1)1,2回なら処理が通っている点 (2)42フレームまで処理し43フレーム目で必ず止まる点 (3)HoughImageをcvReleaseImageしたら処理可能フレーム数が128まで増えた点 以上の点から"定義した何か"の解放忘れであることは予想できたはず。今回はエラーメッセージにこだわりすぎてcvCompareHist関連ばかり調べていたせいで解決が遅れた。現象そのものをもっとよく吟味するべきであった。 10.Link MemStrageやSeqの解放について OpenCVの Bad argument について OpenCV の cvCompareHist について Wikipedia「メモリリーク」 Wikipedia「動的メモリ確保」 c++プログラムメモリリークについて 画像処理を画像の下半分に限定したい場合 ※元画像のサイズ:320×240とする 1.CvRectを定義 CvRect rect1; rect1.x = 0; rect1.y = 120; rect1.width = 320; rect1.height = 120; 2.ROI使用 cvSetImageROI( 入力画像 , rect1 ); 3.何らかの処理 lines = cvHoughLines2( 入力画像 , storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 80, 0, 0 ); 画像変換まとめ 1.チャンネル変換 cvCvtColot使用。1ch⇔3ch , 4ch→3ch , Header→Image の変換を確認。 2.Header→Image 変換 cvCvtColot使用 3.Image→Header変換、Header→Header変換 (1)HeaderA = HeaderB;で直接代入。 (2)HeaderA = cvCloneImage( HeaderB );で変換 4.cvCopyはImageどうしでないと使えない。cvCopy( HeaderA , HeaderB );はできない。 #include "ipl.h" の前に #include "cv.h" を入れるとどうなるか 1.現象 error C2011 _IplImage struct 型の再定義 error C2143 構文エラー } が 定数 の前にありません。 など ipl.h 関係のエラーがたくさん出る。他にも highgui.h , cvaux.h などのエラーも出た。 IplImageのチャンネル数を変える 1.目的 使用するIplImageが4チャンネルでは顔検出が使えないので3チャンネルに減らしたい。 2.方法〔cvCvtColorを使う〕 ※RecordImage内でgrabImageThreadはまだ始まっていない場合 // 画像データ取得 GrabImage(); cvSetImageData( ColorImage4ch, triColorImage.data, ColorImage4ch- widthStep ); // ColorImageへ3チャンネル化 cvCvtColor( ColorImage4ch, ColorImageHsv, CV_BGR2HSV );//CV_BGR2BGRが使えないのでとりあえずHSV(3チャンネル)へ変換 cvCvtColor( ColorImageHsv, ColorImage, CV_HSV2BGR );//改めてBGR(3チャンネル)へ変換 3.注意点 grabImageThread( LPVOID lpParameter )内でも同様の処理が必要 // 画像データ取得 GrabImage(); // ColorImageへ3チャンネル化 cvCvtColor( ColorImage4ch, ColorImageHsv, CV_BGR2HSV );//CV_BGR2BGRが使えないのでとりあえずHSV(3チャンネル)へ変換 cvCvtColor( ColorImageHsv, ColorImage, CV_HSV2BGR );//改めてBGR(3チャンネル)へ変換 ただし、cvSetImageData( ColorImage4ch, triColorImage.data, ColorImage4ch- widthStep );は元から書かれていない。なぜ?結局どうやってflyCaputureや triclops からIplImage へ変換しているのか謎は残る。GrabImage で全て済ませるとは思えないんだが…cvSetImageData( ColorImage4ch, triColorImage.data, ColorImage4ch- widthStep );がなぜない? Median filterが使えない 1.エラーメッセージ OpenCV GUI Error Handler Unsupported format or combination of formats (Median filter only supports 8uC1, 8uC3 and 8uC4 images) in function cvSmooth, C \User\VP\opencv\cv\src\cvsmooth.cpp(1092) Press "Abort" to terminate application. Press "Retry" to debug (if the app is running under debugger). Press "Ignore" to continue (this is not safe). 中止(A) 再試行(R) 無視(I) 2.原因 エラーメッセージの通り、8ビット1~4チャンネルの画像しか使えない。 3.解決方法 16ビットの視差画像の雑音を除去したかったのだが、諦める…か。 ラべリングが遅い 0.注意 平面検出の「PSF遅すぎ」の項で別の原因について言及しているので参照すること。 1.現象 1500ms以上の処理時間がかかっている。 2.原因 cvGetReal2D( 入力画像, y, x ); cvSet2D( 入力画像, y, x, cvScalarAll( 255.0 ) ); のOpenCVを使った画像のピクセルへのアクセスは低速で連続処理への使用は推奨されない。 3.解決方法 ピクセル値の取得 cvGetReal2D( 入力画像, y, x ); ↓ pixl = (unsigned char)入力画像- imageData[y * 入力画像- widthStep + x]; ピクセルへの値格納 cvSet2D( label_dst, y, x, cvScalarAll( 255.0 ) ); ↓ 出力画像- imageData[y * 出力画像- widthStep + x] = (char)値L; 4.Link http //opencv.jp/sample/basic_structures.html cvAndが使えない 1.エラーメッセージ OpenCV GUI Error Handler Formats of input arguments do not match () in function icvLogic, C \User\VP\opencv\cxcore\src\cxlogic.cpp(415) Press "Abort" to terminate application. Press "Retry" to debug (if the app is running under debugger). Press "Ignore" to continue (this is not safe). 中止(A) 再試行(R) 無視(I) 2.現象 コンパイルは通るが実行するとエラーメッセージが出て処理が終わる。めんどいタイプ。cvAndをコメントアウトすると動作する。 3.原因 cvAnd( 入力画像1 , 入力画像2 , 出力画像[マスク] , NULL ) で入力画像1と入力画像2のチャンネル数が違った。 4.解決方法 入力画像1と入力画像2のチャンネル数を合わせる。それだけ。 cvHaarDetectObjectsが使えない 1.症状 コンパイルは通るが実行するとエラーメッセージが出て処理が終わる。めんどいタイプ。cvHaarDetectObjectsをコメントアウトすると動作する。 2.原因 faces = cvHaarDetectObjects (src_gray, cascade, storage, 1.11, 4, 0, cvSize (40, 40)); の2番目の引数cascadeが入っていないため発生した。 const char *cascade_name = "haarcascade_frontalface_default.xml"; でOpenCV備え付けのファイルを使用しようとしていたがこれではできない模様。 3.解決方法 const char *cascade_name = "C /Program Files/OpenCV/data/haarcascades/"haarcascade_frontalface_default.xml"; こんな感じでフルパス入れたらできた。パスが¥(えん)マークでなく/(すらっしゅ)で区切ってあることに注意。 もしくは作業しているディレクトリに"haarcascade_frontalface_default.xmlを探して直接コピペする方法でも解決できた。 4.補足(cvHaarDetectObjectsで読み込むXMLファイルについて) haarcascade_frontalface_default.xml haarcascade_frontalface_alt.xml haarcascade_frontalface_alt2.xml の三種類で顔を検出可能なことを確認。微妙に検出精度が違う。色々試してみるべし。 cvSaveImageが使えない3 1.error messege OpenCV GUI Error Handler Unspecified error (could not save the image) in function cvSaveImage, C \~~\opencv\otherlibs\highgui\loadsave.cpp Press "Abort" to terminate application. Press "Retry" to debug (if the app is running under debugger). Press "Ignore" to continue (this is not safe). 中止(A) 再試行(R) 無視(I) 1.5.現象 cvSaveImageで画像を保存する際、Flag.hファイルで画像ファイルに名前を加えようとすると上記のエラーメッセージが出る。 2.原因→不明w 3.解決方法 色々な言葉を入れていたら直った。原因、原理一切不明。 cvSaveImageが使えない2 1.エラーメッセージ(現象) OpenCV GUI Error Handler Unspecified error (could not find a filter for the specified extension) in function cvSaveImage, C \~~~~~~ Press "Abort" to terminate application. Press "Retry" to debug (if the app is running under debugger). Press "Ignore" to continue (this is not safe). 中止(A) 再試行(R) 無視(I) 例によってビルドでは拾われないタイプ。 2.原因 保存するファイル形式はファイル名につける拡張子によって決まる。ここでサポートされている拡張子を正しく指定しなかったため。 今回のプログラムでは入力画像を[.sift]という特殊な拡張子を用いて区別していたが保存時もその名前をそのまま使用していた。 3.解決策 保存用のファイル名を指定する。 4.Link http //co-coa.sakura.ne.jp/index.php?OpenCV%2FReference cvSaveImageが使えない 1.症状 カメラから取得した視差画像をcvSaveImageで保存すると画面で見たものとは異なる画像が保存される。 2.原因 OpenCVの仕様でcvSaveImageで保存できるのは,8 ビット 1チャンネル,あるいは 8 ビット3 チャンネル( BGR の順)画像だけであるらしい。視差画像は16ビットであった。 3.解決策 データの「16ビット表現」から「8ビット表現」への「スケール変換」は「cvConvert関数」を用いるらしい。 4.Link http //opencv.jp/document/opencvref_highgui.html http //wiki.livedoor.jp/mikk_ni3_92/d/%A5%A8%A5%C3%A5%B8%B8%A1%BD%D02 http //opencv.jp/opencv/document/opencvref_cxcore_arithmetic.html#decl_cvConvertScale cvConvertScaleが使えない 1.エラーメッセージ OpenCV GUI Error Handler Null pointer (The image has NULL data pointer) in function cvGetMat, C \User\VP\opencv\cxcore\src\cxarray.cpp(2794) Press "Abort" to terminate application. Press "Retry" to debug (if the app is running under debugger). Press "Ignore" to continue (this is not safe). 中止(A) 再試行(R) 無視(I) 2.症状 コンパイルは通るが実行すると上記のエラーメッセージが出て処理が終わる。めんどいタイプ。cvConvertScaleをコメントアウトすると動作する。 3.原因 cvConvertScaleはImageHeaderでは使えない。 引数に用いる画像の定義ミスだった。 cvConvertScaleは引数に(入力画像,出力画像)を入れるが、この画像を両方ImaggeHeaderとして定義してしまっていた。 4.解決策 結果を出力する出力画像はImageとして定義を書き換えた。 ImageHeaderで定義されている視差画像をImage化する方法は調査中。 cvConvertScaleが使えない2 1.やりたかったこと 16ビット→8ビット画像への変換。(16bit→8bit変換) 16ビット(65536階調)の画像を8ビット(256階調)画像に変換したい。 cvSaveImageでは16ビットの画像を保存できないから。 2.症状 コンパイル、実行は可能だが結果画像が白色(255)になってしまう。 3.原因 cvCvtScale( 入力画像 , 出力画像 ); // 入力画像 = 16bit , 出力画像 = 8bit 上の形では変換されない。 cvCvtScale( 入力画像 , 出力画像 , scale, shift ); cvCvtScaleは本来上記の形である。 デフォルトはscale = 1 , shift = 0 なので何も書かないと16bitの値(65536階調)の値がそのまま8bitの画像に入ってしまう。 4.解決策 cvCvtScale( 入力画像 , 出力画像 , 0.00390625 , 0 ); ※0.00390625 = 1/256 = 1/2^16*2^8 の意味 5.まとめ(反省点) scale, shiftの存在は早くから知っていたので適当な値を入れて試してみれば解決は早かったかもしれない。調査の優先順位の付け方に経験が足りなかった。 6.Link http //opencv.jp/opencv/document/opencvref_cxcore_arithmetic.html http //tessy.org/wiki/index.php?%B9%D4%CE%F3%A4%C8%B2%E8%C1%FC%A4%CE%CA%D1%B4%B9#ded1b6b1 http //www.vrac.iastate.edu/575x/S07/doku.php?id=foo homework hw3 http //code.google.com/p/eyepatch/source/diff?r=97 format=side path=/trunk/MotionClassifier.cpp cvCopyが使えない3 1.エラーメッセージ OpenCV GUI Error Handler Null pointer (The image has NULL data pointer) in function cvGetMat, C \User\VP\opencv\cxcore\src\cxarray.cpp(2794) Press "Abort" to terminate application. Press "Retry" to debug (if the app is running under debugger). Press "Ignore" to continue (this is not safe). 中止(A) 再試行(R) 無視(I) 2.原因 cvCopyはcvCopy( Header , Header );はできない。 3.解決方法 (1)HeaderA = HeaderB;で直接代入する。 (2)HeaderA = cvCloneImage( HeaderB );で変換 cvCopyが使えない2 1.エラーメッセージ OpenCV GUI Error Handler Formats of input arguments do not match () in function cvCopy, C \User\VP\opencv\cxcore\src\cxcopy.cpp(415) Press "Abort" to terminate application. Press "Retry" to debug (if the app is running under debugger). Press "Ignore" to continue (this is not safe). 中止(A) 再試行(R) 無視(I) または PTracker.exe - アプリケーション エラー 例外 unknown software exception (0x80000003) がアプリケーションの 0x060612c6 で発生しました。 プログラムを終了するには [OK] をクリックしてください プログラムをデバッグするには [キャンセル] をクリックしてください OK キャンセル 2.原因 コピー元配列とコピー先配列は,同じ型,同じ次元,同じサイズでなければならない。IplImageのチャンネル数が違っていた。 3.解決方法 cvCopyで使用する入出力Imageの定義を調べる。 (1)デバッグを使用 (2)Imageを指定 (3)channelを確認 (4)変更 ただしデバッグでcvCopyの部分を表示しない場合もある。今後は怪しいIplImageを特定して[ cvCopy( ~~IplImage ]で検索かけた方がいいかも。 cvCopyが使えない 1.症状 コンパイルは通るが実行するとエラーメッセージが出て処理が終わる。 2.原因 コピー元配列とコピー先配列は,同じ型,同じ次元,同じサイズでなければならない。ImageHeaderをImageにコピーしようとしていた。 3.解決 ImageHeader→Image変換 IplImageの開放について Webカメラから直接取得するために使用したIplImageはcvReleaseImage( captureImage )などで開放する必要はない。 なぜならcvCreateImageなどでIplImageの領域確保を行ってないため。 ImageHeaderとは? 1.概要 要するに CreateImage ヘッダの作成とデータ領域の確保 CreateImageHeade メモリ確保と初期化を行い,IplImage 構造体を返す の似たような動作をする二つの関数が存在して違いがわからん。 2.予想 Image ∋ ImageHeader の関係か?調査続行 3.Link http //opencv.jp/opencv/document/opencvref_cxcore_init.html MiniBeeで画像のレクティファイが出来ない(調査中) 1.解決策 triclops内にレクティファイイメージがあるはず…
https://w.atwiki.jp/projectwiki/pages/23.html
OpenCV-Private-Framework-1.1.dmg XcodeでつかえるOpenCVのFramework見付けたのでメモ。 Mac OS X OpenCV Port http //opencvlibrary.sourceforge.net/Mac_OS_X_OpenCV_Port インストール 解凍した中にあるOpenCV.frameworkをライブラリにコピーします。 場所は(Tigerの場合)/システム/ライブラリ/Frameworks で良いかと思います。 ここを編集
https://w.atwiki.jp/perception_design/pages/33.html
OpenCVにの課題、連絡などのためのページ OpenCVの参考書について 【OpenCVを使ってウィンドウに画像を表示させる】5月20日まで... 20日までの課題解説(5月19日更新) 20日までの課題がまだ完成していない人向け(5月20日更新) 【ウィンドウに複数の画像を表示させる】5月30日まで... 課題説明
https://w.atwiki.jp/projectwiki/pages/17.html
環境:WindowsXP + Visual Studio .NET 2003 ダウンロード SourceForge.net Files http //sourceforge.net/project/showfiles.php?group_id=22870 から"opencv-win"をダウンロードします。 インストール ダウンロードしたファイルを実行します。 cvaux.hに訂正がある場合があります。 C \Program Files\[[OpenCV]]\cvaux\include\cvaux.hの1137行目 誤:「CvMemStorage* storage; /*storage for 吐oreground_regions・/」 正:「CvMemStorage* storage; /*storage for 吐oreground_regions*/」 コメントの最後の部分「*/」が「・/」と文字化け(?)を起こしているようです。 "吐"も明らかにおかしいですが、コメント内なので気にしなくて良いんじゃないでしょうか?w PATHを通す OpenCVをインストールしたフォルダの\binフォルダを環境変数PATHに追加します。 今回は例として、「C \Program Files\OpenCV\bin」(このアドレスが一般的?)とします。 コントロールパネル ↓ システム ↓ プロパティ ↓ 詳細設定 ↓ 環境変数 ↓ システム環境変数の「Path」を選択 ↓ 編集 ↓ 変数値に「;C \Program Files\OpenCV\bin」を追加 (既存の変数値は消さずにセミコロン(;)とアドレスを追加する) VS.NET側の設定 VS.NETメニューバーのツール ↓ オプション ↓ 左部メニューのプロジェクト ↓ VC++ディレクトリ ↓ 右上「ディレクトリを表示するプロジェクト」をインクルードファイルにする ↓ すぐ下の「新しい行ボタン」(フォルダのイラスト)を押して以下を追加する (C \Program FilesにOpenCVをインストールした場合) C \Program Files\OpenCV\cv\include C \Program Files\OpenCV\cvaux\include C \Program Files\OpenCV\cxcore\include C \Program Files\OpenCV\otherlibs\highgui ↓ 右上「ディレクトリを表示するプロジェクト」をライブラリファイルにする ↓ すぐ下の「新しい行ボタン」(フォルダのイラスト)を押して以下を追加する (C \Program FilesにOpenCVをインストールした場合) C \Program Files\OpenCV\lib プロジェクトの設定 VS.NETメニューバーのプロジェクト ↓ (プロジェクト名)のプロパティ ↓ 左部メニューのリンカ ↓ 入力 ↓ 追加の依存ファイルに「cv.lib cxcore.lib cvaux.lib highgui.lib」を入力します 環境:MacOSX(Tiger) + Xcode こちらを参照 ここを編集
https://w.atwiki.jp/jfactory/pages/23.html
OpenCVで遊ぶ Visual C++ 2005 Express Edition使用 開発準備プラットフォームSDKのインストール(ファイル名 PSDK-x86.exe) OpenCVのインストール(ファイル名 OpenCV_1.0.exe) 準備完了のテスト 速度計測cvCreateImage/cvReleaseImageの速度 LockBits/UnlockBitsの速度 Create-LockBits-UnlockBits-Releaseの速度 本命!Bitmapで渡し、内部でOpenCVを使うときのオーバーヘッド (おまけ)System Drawing Bitmapの生成の速度 ラプラシアンフィルタの速度 ガウシアンフィルタの速度 メディアンフィルタの速度 cvConvertScaleAbsの速度 小技時間計測 マネージコードといっしょに使う 開発準備 プラットフォームSDKのインストール(ファイル名 PSDK-x86.exe) Microsoftからダウンロードできますので、適当に探してインストールします。途中で何か聞いてきても、すべてデフォでOKです。 インストールが完了したら、Visual C++ 2005 Express Editionを設定します。 1.[ツール]→[オプション]ダイアログを開き、左側のツリーから[プロジェクトおよびソリューション]→[VC++ディレクトリ]を選び、[ディレクトリを表示するプロジェクト]から[インクルードファイル]を選択し、下記を追加する。 C \Program Files\Microsoft Platform SDK\Include 2.[ディレクトリを表示するプロジェクト]から[ライブラリファイル]を選択し、下記を追加する。 C \Program Files\Microsoft Platform SDK\Lib 3.[ディレクトリを表示するプロジェクト]から[実行可能ファイル]を選択し、下記を追加する。 C \Program Files\Microsoft Platform SDK\Bin OpenCVのインストール(ファイル名 OpenCV_1.0.exe) SourceForgeからダウンロードできますので、適当に探してインストールします。やっぱり、すべてデフォでOKです。 1.[ツール]→[オプション]ダイアログを開き、左側のツリーから[プロジェクトおよびソリューション]→[VC++ディレクトリ]を選び、[ディレクトリを表示するプロジェクト]から[インクルードファイル]を選択し、下記を追加する。 C \Program Files\OpenCV\cv\include C \Program Files\OpenCV\cvaux\include C \Program Files\OpenCV\cxcore\include C \Program Files\OpenCV\otherlibs\highgui 2.[ディレクトリを表示するプロジェクト]から[ライブラリファイル]を選択し、下記を追加する。 C \Program Files\OpenCV\lib 準備完了のテスト 1.[ファイル]→[新規作成]→[プロジェクト]ダイアログを開き、Win32コンソールアプリケーションを選択する。Win32アプリケーションウィザードが起動するので、[次へ]を選び、[空のプロジェクト]にチェックを入れる。 2.[alt+F7]でプロジェクトプロパティダイアログを開き、[構成プロパティ]→[リンカ]→[入力]で、[追加の依存ファイル]に、"highgui.lib"を追加する。 3.[ソリューションエクスプローラ]の[ソースファイル]で右クリックし、[追加]→[新しい項目]を選択する。[カテゴリ]="コード"、[テンプレート]="C++ファイル"を選択し、[ファイル名]のところに適当なファイル名を入れ、下のコードをコピペする。 #include "highgui.h" int main(int, char) { char windowName[] = "OpenCV"; cvNamedWindow(windowName, CV_WINDOW_AUTOSIZE); for (;;) { int key = cvWaitKey(-1); if (key== q ) break; } cvDestroyWindow(windowName); return 0; } 4.[F5]で実行する。黒いウィンドウと、灰色のウィンドウが出ればOK。 q キーで終了する。 速度計測 テストで使用しているのは、WindowsXPで、Pentium4-3GHz(HT)のマシンです。 まずは、こんなコードで関数呼び出し時の時間を計測してみました。 #pragma unmanaged #include "cv.h" #pragma managed using namespace System; using namespace System Drawing; void test(void) { ; } int main(array System String ^ ^args) { const int loopCoint = 1000000; Diagnostics Stopwatch sw; Threading Thread Sleep(5000); Console WriteLine("start"); sw.Start(); for( int i = 0 ; i loopCoint ; i ++ ) { test(); } sw.Stop(); Console WriteLine(sw.ElapsedMilliseconds + "ms"); Console ReadLine(); return 0; } 結果は1000000回ループで9msと表示されたので、約9nsということになります。 これからのテストは、Test関数をいろいろと変えてみます。速度によっては、loopCount変数も変更します。また、表示部分を Console WriteLine(Convert ToDouble(sw.ElapsedMilliseconds)/loopCount + "ms"); に書き換えました。 cvCreateImage/cvReleaseImageの速度 void test(void) { IplImage* ipl = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1); cvReleaseImage( ipl); } 結果は、5回実行して0.29~0.31msでした。約0.3msといったところでしょうか。 LockBits/UnlockBitsの速度 // 呼び出し元のBitmapもFormat8bppIndexedです。 void test(Bitmap^ bmp) { BitmapData^ bmpData = bmp- LockBits( Rectangle(0,0,bmp- Width,bmp- Height), ImageLockMode ReadWrite, PixelFormat Format8bppIndexed); ; bmp- UnlockBits(bmpData); } 結果は、5回実行して0.0031~0.0037msでした。無視できる時間ですね。 Create-LockBits-UnlockBits-Releaseの速度 // 呼び出し元のBitmapもFormat8bppIndexedです。 void test(Bitmap^ bmp) { IplImage* ipl = cvCreateImage( cvSize(bmp- Width,bmp- Height), IPL_DEPTH_8U, 1); BitmapData^ bmpData = bmp- LockBits( Rectangle(0,0,bmp- Width,bmp- Height), ImageLockMode ReadWrite, PixelFormat Format8bppIndexed); ; bmp- UnlockBits(bmpData); cvReleaseImage( ipl); } 結果は、5回実行して0.29~0.33msでした。まあ、予想通り約0.3msですね。 本命!Bitmapで渡し、内部でOpenCVを使うときのオーバーヘッド // 呼び出し元のBitmapもFormat8bppIndexedです。 Bitmap^ test(Bitmap^ bmp) { // 引数チェック if (bmp==nullptr) return nullptr; if (bmp- PixelFormat!=PixelFormat Format8bppIndexed) return nullptr; IplImage* ipl = cvCreateImage( cvSize(bmp- Width,bmp- Height), IPL_DEPTH_8U, 1); BitmapData^ bmpData = bmp- LockBits( Rectangle(0,0,bmp- Width,bmp- Height), ImageLockMode ReadWrite, PixelFormat Format8bppIndexed); // if (bmpData- Stride != ipl- widthStep) // ラインごとのコピー処理 // BitmapからIplImageへコピー memcpy_s(ipl- imageData, ipl- widthStep * ipl- height, bmpData- Scan0.ToPointer(), bmpData- Stride * bmpData- Height); // // ここでOpenCVを使う // // IplImageからBitmapへコピー memcpy_s(bmpData- Scan0.ToPointer(),bmpData- Stride * bmpData- Height, ipl- imageData, ipl- widthStep * ipl- height); bmp- UnlockBits(bmpData); cvReleaseImage( ipl); return bmp; } 結果は、5回実行して0.87~0.90msでした。約0.9msといったところでしょうか。 (おまけ)System Drawing Bitmapの生成の速度 void test(void) { Bitmap^ bmp2 = gcnew Bitmap(640, 480, Imaging PixelFormat Format8bppIndexed); } 結果は、約0.6msでした。 ラプラシアンフィルタの速度 OpenCVのcvLaplaceで用いられているオペレータを、ソースから拾い出してみました。 3×3 -1 -1 -1 -1 8 -1 -1 -1 -1 5×5 -1 -1 -1 -1 -1 -1 -2 -2 -2 -1 -1 -2 32 -2 -1 -1 -2 -2 -2 -1 -1 -1 -1 -1 -1 7×7 -1 -1 -1 -1 -1 -1 -1 -1 -2 -2 -2 -2 -2 -1 -1 -2 -3 -3 -3 -2 -1 -1 -2 -3 80 -3 -2 -1 -1 -2 -3 -3 -3 -2 -1 -1 -2 -2 -2 -2 -2 -1 -1 -1 -1 -1 -1 -1 -1 例によって、速度を計測してみます。計測環境は、P4-3GHz(HT)+1GB+WinXPです。実際の使用状態に近いように、640×480:8ビットグレースケールで、cvConvertScaleAbsを入れています。10回実行の平均時間です。 3×3の時、19.9ms 5×5の時、30.2ms 7×7の時、75.9ms cvConvertScaleAbs単独は4.3msです。………かなり遅めですね。いろいろなフォーマットに対応しているせいもあるのでしょうけど。 スミマセヌ。計測ミスです。コンソールアプリとしてテストプログラムを作成し、再計測しました。 計測環境は、P4-3GHz(HT)+1GB+WinXPで、640×480:8ビットグレースケールです。 3×3の時、2.723ms 5×5の時、4.046ms 7×7の時、13.581ms 関係各位の方々、ご迷惑をおかけしましたm(_ _)m #pragma unmanaged #include "cv.h" #pragma managed using namespace System; using namespace System Drawing; int main(array System String ^ ^args) { const int loopCount = 1000; IplImage* ipl8U = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1); IplImage* ipl16S = cvCreateImage(cvSize(640,480), IPL_DEPTH_16S, 1); Diagnostics Stopwatch sw; Threading Thread Sleep(5000); Console WriteLine("start"); sw.Start(); for( int i = 0 ; i loopCount ; i ++ ) { cvLaplace(ipl8U, ipl16S, 7); // 3 or 5 or 7 } sw.Stop(); Console WriteLine(static_cast double (sw.ElapsedMilliseconds) / static_cast double (loopCount) + "ms"); cvReleaseImage( ipl8U); cvReleaseImage( ipl16S); Console ReadLine(); return 0; } ガウシアンフィルタの速度 一般的な画像処理ライブラリでは、3×3と5×5のみで、オペレータ固定が多いですが、OpenCVでは、σ(シグマ)を指定したり、オペレータのサイズからσ(シグマ)を決め、まじめに計算してオペレータを作っているようです。 σ = (n/2-1)*0.3 + 0.8 (n=オペレータのサイズ) 3×3のときは0.95、5×5のときは1.25となります。 計測環境は、P4-3GHz(HT)+1GB+WinXPです。640×480:8ビットグレースケールです。10回実行の平均時間です。 3×3の時、5.6ms 5×5の時、8.1ms 7×7の時、13.6ms スミマセヌ。計測ミスです。コンソールアプリとしてテストプログラムを作成し、再計測しました。 計測環境は、P4-3GHz(HT)+1GB+WinXPで、640×480:8ビットグレースケールです。 3×3の時、2.948ms 5×5の時、4.307ms 7×7の時、6.649ms 関係各位の方々、ご迷惑をおかけしましたm(_ _)m #pragma unmanaged #include "cv.h" #pragma managed using namespace System; using namespace System Drawing; int main(array System String ^ ^args) { const int loopCount = 1000; IplImage* ipl8U = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1); Diagnostics Stopwatch sw; Threading Thread Sleep(5000); Console WriteLine("start"); sw.Start(); for( int i = 0 ; i loopCount ; i ++ ) { cvSmooth(ipl8U, ipl8U, CV_GAUSSIAN , 7); // 3 or 5 or 7 } sw.Stop(); Console WriteLine(static_cast double (sw.ElapsedMilliseconds) / static_cast double (loopCount) + "ms"); cvReleaseImage( ipl8U); Console ReadLine(); return 0; } メディアンフィルタの速度 計測環境は、P4-3GHz(HT)+1GB+WinXPです。640×480:8ビットグレースケールです。10回実行の平均時間です。 3×3の時、11.8ms 5×5の時、42.5ms 7×7の時、57.6ms スミマセヌ。計測ミスです。コンソールアプリとしてテストプログラムを作成し、再計測しました。 計測環境は、P4-3GHz(HT)+1GB+WinXPで、640×480:8ビットグレースケールです。 3×3の時、6.775ms 5×5の時、25.695ms 7×7の時、33.042ms 関係各位の方々、ご迷惑をおかけしましたm(_ _)m #pragma unmanaged #include "cv.h" #pragma managed using namespace System; using namespace System Drawing; int main(array System String ^ ^args) { const int loopCount = 1000; IplImage* ipl8U = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1); Diagnostics Stopwatch sw; Threading Thread Sleep(5000); Console WriteLine("start"); sw.Start(); for( int i = 0 ; i loopCount ; i ++ ) { cvSmooth(ipl8U, ipl8U, CV_MEDIAN , 7); // 3 or 5 or 7 } sw.Stop(); Console WriteLine(static_cast double (sw.ElapsedMilliseconds) / static_cast double (loopCount) + "ms"); cvReleaseImage( ipl8U); Console ReadLine(); return 0; } cvConvertScaleAbsの速度 エッジ抽出と一緒に使うことの多い、cvConvertScaleAbsの速度を計測して見ました。 結果は、2.189(0で埋めた)~4.099(ランダムで-500~500で埋めた)でした。内部で条件分岐が起こるようにすると、見事に遅くなりました。 計測環境は、P4-3GHz(HT)+1GB+WinXPで、640×480:8ビットグレースケールです。 #pragma unmanaged #include "cv.h" #pragma managed using namespace System; using namespace System Drawing; int main(array System String ^ ^args) { const int loopCount = 1000; IplImage* ipl8U = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1); IplImage* ipl16S = cvCreateImage(cvSize(640,480), IPL_DEPTH_16S, 1); Random^ rand = gcnew Random(); short* p16S = reinterpret_cast short* (ipl16S- imageData); for (int i = 0 ; i ipl16S- widthStep/2 * ipl16S- height ; i++ ) { *(p16S++) = Convert ToInt16(rand- Next(-500,500)); // !どちらか! // *(p16S++) = 0; // !どちらか! } Diagnostics Stopwatch sw; Threading Thread Sleep(5000); Console WriteLine("start"); sw.Start(); for( int i = 0 ; i loopCount ; i ++ ) { cvSmooth(ipl8U, ipl8U, CV_MEDIAN , 7); // 3 or 5 or 7 } sw.Stop(); Console WriteLine(static_cast double (sw.ElapsedMilliseconds) / static_cast double (loopCount) + "ms"); cvReleaseImage( ipl8U); cvReleaseImage( ipl16S); Console ReadLine(); return 0; } 小技 時間計測 大まかな処理時間の計測ができる。 int64 st = cvGetTickCount(); // 時間計測したい処理をここに書く sprintf_s("%f ms",(cvGetTickCount()-st)/cvGetTickFrequency()/1000.0); // 単位1/1000秒 マネージコードといっしょに使う プロジェクトプロパティの共通言語サポートを、純粋MSIL言語サポート(/clr pure)から、共通言語サポート(/clr)に変更する。 "cv.h"をインクルードすると、下記のワーニングが出たので、 1 c \program files\opencv\cxcore\include\cxtypes.h(212) warning C4793 __asm 関数 int cvRound(double) 用にネイティブ コードの生成が発生します 1 c \program files\opencv\cxcore\include\cxtypes.h(205) cvRound の宣言を確認してください。 以下のようにして回避した。 #pragma unmanaged #include "cv.h" #pragma managed
https://w.atwiki.jp/suffix/pages/328.html
大体はhttp //chihara.naist.jp/people/2004/kenta-t/OpenCV/pukiwiki/index.php?%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB に書いてある通り。 c \program files\opencv\cv\include\cvcompat.h(784) warning C4819 ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。 データの損失を防ぐために、ファイルを Unicode 形式で保存してください。 のエラーも出たので、ここ (http //chihara.naist.jp/opencv/?Visual%20C%2B%2B%202008%20Express%20Edition)もチェック。 引用文:cvcompat.h を Visual C++ で読み込み、変更(1文字書き込んですぐ消すなど)を加えた後で保存すると warning が消える。 Visual C++のプロジェクトの違いは http //detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1021431545 参照。 その他: VC++の引数の指定方法
https://w.atwiki.jp/nkym_memo/pages/59.html
fedora13におけるOpenCVのインストール OpenCVライブラリのダウンロード http //opencv.jp/download 解凍 CMakeのインストール #yum install cmake 各ライブラリのインストール # yum install libpng-devel libjpeg-devel libtiff-devel ffmpegのインストール yumにgpgkeyをインポート # rpm --import http //ATrpms.net/RPM-GPG-KEY.atrpms yumのリポジトリを追加 # vi /etc/yum.repos.d/atrpms.repo [atrpms] name=Fedora Core $releasever - $basearch - ATrpms baseurl=http //dl.atrpms.net/f$releasever-$basearch/atrpms/stable gpgkey=http //ATrpms.net/RPM-GPG-KEY.atrpms gpgcheck=1 yumでffmpegをインストール # yum -y install ffmpeg cmake(wikiより引用) cd ~/projects/opencv # the directory containing INSTALL, CMakeLists.txt etc. mkdir release cd release cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_PYTHON_SUPPORT=ON .. make make install ※make -jでマルチコアでコンパイル/高速化 etc/profileに以下の設定を追加 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig /usr/lib/pkgconfig /etc/ld.so.conf に以下の設定を追加 /usr/local/lib 最後に ldconfig
https://w.atwiki.jp/objcmemo/pages/97.html
cv MatからIplImageへの変換 //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ //変換元画像 cv Mat mat(240, 320, CV_8UC3); //変換先画像 IplImage iplImage = mat; //ポインターではない(実体) IplImage iplImage2 = mat; // 〃 //後始末について //変換先画像を以下のように無理に解放してはいけない。 // IplImage* pIplImage = iplImage; // cvReleaseImage( pIplImage); //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ IplImageからcv Matへの変換 //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ //変換元画像 IplImage* iplImage = cvCreateImage(cvSize(320,240), IPL_DEPTH_8S, 3); //変換先画像 cv Mat mat(iplImage); //(1)コピーコンストラクタ cv Mat mat2; mat2 = iplImage; //(2)ポインタの代入 //後始末について cvReleaseImage( iplImage);//元画像は開放すべき /** * 抽出された赤系色イメージを生成する * @param orgImage 元イメージ * @return 生成イメージ */ + (UIImage *)createExtractedRedElementColorImage (UIImage *)orgImage { IplImage *srcIpl = [OpenCVManager createIplImageFromUIImage orgImage]; IplImage *dstIpl = cvCreateImage(cvGetSize(srcIpl), IPL_DEPTH_8U, 3); [self extractColorWithSrcImage srcIpl dstImage dstIpl code CV_BGR2HSV ch1Lower 170 ch1Upper 10 ch2Lower 80 ch2Upper 255 ch3Lower 0 ch3Upper 255]; UIImage *image = [OpenCVManager createUIImageFromIplImage dstIpl]; cvReleaseImage( dstIpl); cvReleaseImage( srcIpl); return image; } /** * 閾値指定(HSV)による色を抽出する * @param src_img 入力画像(8bit3ch) 4chの間違い? * @param dst_img 出力画像(8bit3ch) * @param code 色空間の指定(CV_BGR2HSV,CV_BGR2Labなど) * @param ch1_lower ch1のしきい値(小) * @param ch1_upper ch1のしきい値(大) * @param ch2_lower ch2のしきい値(小) * @param ch2_upper ch2のしきい値(大) * @param ch3_lower ch3のしきい値(小) * @param ch3_upper ch3のしきい値(大) * @remarks lower = upperの場合、lower以上upper以下の範囲を抽出、 * lower upperの場合、upper以下lower以上の範囲を抽出します。 */ + (void)extractColorWithSrcImage (IplImage *)src_img dstImage (IplImage *)dst_img code (int)code ch1Lower (int)ch1_lower ch1Upper (int)ch1_upper ch2Lower (int)ch2_lower ch2Upper (int)ch2_upper ch3Lower (int)ch3_lower ch3Upper (int)ch3_upper { int i, k; IplImage *Color_img; IplImage *ch1_img, *ch2_img, *ch3_img; IplImage *Mask_img; int lower[3]; int upper[3]; int val[3]; CvMat *lut; //codeに基づいたカラー変換 Color_img = cvCreateImage(cvGetSize(src_img), src_img- depth, src_img- nChannels); cvCvtColor(src_img, Color_img, code); //3ChのLUT作成 lut = cvCreateMat(256, 1, CV_8UC3); lower[0] = ch1_lower; lower[1] = ch2_lower; lower[2] = ch3_lower; upper[0] = ch1_upper; upper[1] = ch2_upper; upper[2] = ch3_upper; for (i = 0; i 256; i++){ for (k = 0; k 3; k++){ if (lower[k] = upper[k]){ if ((lower[k] = i) (i = upper[k])){ val[k] = 255; }else{ val[k] = 0; } }else{ if ((i = upper[k]) || (lower[k] = i)){ val[k] = 255; }else{ val[k] = 0; } } } //LUTの設定 cvSet1D(lut, i, cvScalar(val[0], val[1], val[2])); } //3ChごとのLUT変換(各チャンネルごとに2値化処理) cvLUT(Color_img, Color_img, lut); cvReleaseMat( lut); //各チャンネルごとのIplImageを確保する ch1_img = cvCreateImage(cvGetSize(Color_img), Color_img- depth, 1); ch2_img = cvCreateImage(cvGetSize(Color_img), Color_img- depth, 1); ch3_img = cvCreateImage(cvGetSize(Color_img), Color_img- depth, 1); //チャンネルごとに二値化された画像をそれぞれのチャンネルに分解する cvSplit(Color_img, ch1_img, ch2_img, ch3_img, NULL); //3Ch全てのANDを取り、マスク画像を作成する。 Mask_img = cvCreateImage(cvGetSize(Color_img), Color_img- depth, 1); cvAnd(ch1_img, ch2_img, Mask_img); cvAnd(Mask_img, ch3_img, Mask_img); //入力画像(src_img)のマスク領域を出力画像(dst_img)へコピーする cvZero(dst_img); cvCopy(src_img, dst_img, Mask_img); //解放 cvReleaseImage( Color_img); cvReleaseImage( ch1_img); cvReleaseImage( ch2_img); cvReleaseImage( ch3_img); cvReleaseImage( Mask_img); } #if TRUE // 外接矩形(回転なし)を描画する cv Rect brect = cv boundingRect(cv Mat(targetCorners).reshape(2)); p2f[0] = brect.tl(); p2f[1] = cv Point2f(brect.tl().x, brect.br().y); p2f[2] = brect.br(); p2f[3] = cv Point2f(brect.br().x, brect.tl().y); rectangle(orgMat, brect.tl(), brect.br(), Scalar(255, 0, 0), 2, CV_AA); #else // 外接矩形(回転あり)を描画する cv RotatedRect box = cv minAreaRect(cv Mat(targetCorners).reshape(2)); box.points(p2f); for (int i = 0; i 4; i++) { cv line(orgMat, p2f[i], p2f[i 3?i+1 0], cv Scalar(255, 0, 0), 2, CV_AA); } #endif