openCVの超解像処理:複数の画像を使って実行する方法

このQ&Aのポイント
  • openCVの超解像処理について質問させていただきます。
  • 現在、http://opencv.jp/opencv2-x-samples/usage_of_sparsemat_2_superresolution の超解像処理を実行しています。
  • しかし、自分が持っている複数の画像を使って超解像処理を実行したいです。プログラムのどの部分を変更すればいいでしょうか?
回答を見る
  • ベストアンサー

openCVの超解像処理 その2

前回,openCVの超解像処理を質問させてもらったものです. 今, http://opencv.jp/opencv2-x-samples/usage_of_sparsemat_2_superresolution の超解像処理をそのまま実行しています. 前回の質問(http://okwave.jp/qa/q6341130.html)で,1枚の画像を劣化させて複数の画像を作りだして,超解像処理をしていることはわかり,実行できるようになりました. しかし,実際に行いたいのは,自分が持っている複数の画像を使って超解像処理を実行してみたいのですが,その場合プログラムのどの部分をどのように変えたらいいのでしょうか? ヒントだけでもいいので,ご面倒かもしれませんが,ご教授お願いします.

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

この関数 createDegradedImageandSparseMat32F(Mat& src, Mat& dest, Point2d move, int amp) の引数ampが画像解像度の倍率を表しています.ampを入力する画像に合わせて倍率を変えてみてください. ただし,実画像の画像ずれはshiftだけで表現することはかなり難しいです.実際の画像の場合は少なくとも平面の場合,アフィン変換,射影変換でずれを表現しなければ使えないかもしれません.その時は, createDownsampledMotionandBlurCCDSparseMat32f内の疎行列の定義している部分(287~30行目)を変えてみてください.

kooooool
質問者

お礼

何度も本当にありがとうございました. ご意見を参考にさせていただいて,頑張ってみます. 本当にありがとうございました.

その他の回答 (1)

回答No.1

このコードの作成者です. 超解像は, 1.位置合わせ 2.ブラーカーネル(ぼけ関数)の推定 3.例外除去(お好みで) 4.超解像(このデモで行っている処理) をする必要があり,このデモでは位置合わせが既知,ブラーカーネルも既知(一定)でイレギュラー値は存在しないと仮定して問題を解いています. 実際のアプリケーションのように使うには,まず位置合わせの後,ぼけ関数推定をしたのち,イレギュラーにならない部分を推定するという作業が必要になります. もしこのソースをもとにするなら, 位置合わせ結果とボケ関数推定結果を入力する部分を(イレギュラーっぽいものは0でマスクするなど例外処理もできるとなお良い) createDownsampledMotionandBlurCCDSparseMat32f に追加追加し,スパース行列を正しく入力してあげることが出来れば他はあまり変更せずに動作すると思います.

参考URL:
http://opencv.jp/opencv2-x-samples/usage_of_sparsemat_2_superresolution
kooooool
質問者

補足

早速の解答ありがとうございます. 解答者様のおかげで多少つかめてきました. そこで,60~72行目を以下のように変更してみました. 入力画像を2倍に高解像度化しようとしています(つまり,rfactor = 2 としている).画像の位置ズレ量は別のプログラムで推定したという前提で,ブラーカーネルもいじってません. //(1) generate degraded images and degrading matrices for super resolution for(int i=0;i<image_count;i++) { cout<<i<<endl;     // shift[i]には,別プログラムで求めたサブピクセルレベルの位置ズレ量     // が入る move[i].x = shift[i].x; move[i].y = shift[i].y; if(i==0)// fix first image { move[i].x=0; move[i].y=0; } Mat imtemp(image.rows,image.cols,CV_8UC3); char file[30] sprintf( file, "img%d", i); degimage[i] = imread(file); このようにすると,326行目の dvec.reshape(3,dest.rows).convertTo(dest,CV_8UC3); でエラーが発生してしまいます. おそらく,imtempの行列サイズを変更したからだと思うのですが,解像度を向上させる場合はこのように変更しなければいけないのではないのですか? とりあえず, ・入力画像を2倍に高解像度化したい ・位置ズレ量は既知 ・ブラーカーネルもデフォルトのまま これらの条件で実行したいと考えているので,お知恵をお借りしたいです. 長文失礼しました.

関連するQ&A

  • openCVの超解像処理

    openCVの超解像処理 ttp://opencv.jp/opencv2-x-samples/usage_of_sparsemat_2_superresolution をそのまま実行しようとしているのですが,処理に使う画像のファイル名はどのようにしたらいいのでしょうか? サンプルでは, Mat image = imread("lenna.png"); となっていますが,これだと,1枚しか読み込まないのではないですか? 解説では,16枚使用したと書いていますが,他の15枚の画像のファイルパスはどのように指定しているのでしょうか? 質問の内容がわかり難くてすみません.

  • OpenCVを使った超解像について

    はじめまして。 初投稿です。 OpenCVで http://opencv.jp/opencv2-x-samples/usage_of_sparsemat_2_superresolution 上記プログラムをそのままVisual Studioでコンパイル・実行をしています。 「Invalid Image name」と表示され、実行できません。 どなたか解決方法を教えていただけないでしょうか。 よろしくお願いします。

  • OpenCVで処理した画像の表示方法。

    VC++でOpenCVを使って画像処理を研究中です。 OpenCVでの画像の表示は、 char *filename = "lena.jpg"; image = cvLoadImage(filename, CV_LOAD_IMAGE_COLOR); cvNamedWindow ("lena", CV_WINDOW_AUTOSIZE); cvShowImage ("lena",image); で出来るということは分かりました。 しかし、MFCで作ったフォームのピクチャーボックスへの表示の仕方が分かりません。 画像処理は実行ボタンでpictureBox1の元の画像をpictureBox2に表示させようと考えております。 回答のほど、どうぞよろしくお願いいたします。 また、分かりやすいサイトなどありましたらお願いします。

  • OPENCVのサンプルプログラムについて

    OPENCVのサンプルプログラムに「peopledetect」というものがあり.exeファイルを実行してみたのですがすぐに消えてしまい。 あたらしく作ったファイルで実行してもUsage: peopledetect (<image_filename> | <image_list>.txt) と表示されるだけで人物認識をしません。 このサンプルプログラムの使い方を教えてもらえないでしょうか。 またどこかプログラムを変更する必要があるのならばそこを教えていただけないでしょうか・・・。 まず人物認識をするための画像を入れる場所もわかっていない状態です・・・。

  • 現在opencvについて勉強中の者です。

    現在opencvについて勉強中の者です。 OpenCV2.1¥samples¥cの中にあるstereo_match.exeというサンプルプログラムを実行すると距離画像が生成できると聞いたのですが実行方法がわかりません。 アイコンをダブルクリックするだけでは一瞬コマンドプロンプトのウィンドウが出てくるだけですぐ終了してしまいますし、直接コマンドをうったら Usage: stereo_match <left_image> <right_image> [--algorithm=bm|sgbm|hh] [--block size=<block_size>] [--max-disparity=<max_disparity>] [-i <intrinsic_filename>] [-e <extrinsic_filen ame>] [--no-display] [-o <disparity_image>] [-p <point_cloud_file>] という文章が出てくるだけで終わってしまいます。 同じフォルダの中にあるstereo_calibというサンプルプログラムを実行することでステレオキャリブレーションは実行済みです。 ちなみにOSはWindows Vistaです。

  • Opencvで質問

     Opencv初心者です。  今日opencvとVC++2010を設定して今練習中なのですが   #include <stdexcept>   #include <opencv/cv.h>   #include <opencv/highgui.h>   int main (int argc, char* argv[]){   const char *fileName = "C:\\Program Files\\OpenCV2.3.1\\samples\\c\\lena.jpg";   const char *windowName = "lena";   ::IplImage* img = ::cvLoadImage(fileName);   ::cvNamedWindow(windowName);   ::cvShowImage(windowName,img);   ::cvWaitKey();   ::cvDestroyWindow(windowName);   ::cvReleaseImage(&img);   }  と言うサンプルをビルドしたら  1>------ ビルド開始: プロジェクト: 画像処理練習, 構成: Debug Win32 ------  1>LINK : fatal error LNK1104: ファイル 'opencv_core231.lib' を開くことができません。  ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========  エラーが出てしまい先に進めません。  もしかしたら他に設定が悪いのでしょうか?  インストールもC:\Program Files\OpenCV2.3.1に名前も変えインストールしました。  ttp://shiotani.cn/20110904vc2010opencv.html  ここを参考にさせていただきました。 よろしくお願いします。

  • OPENCVでの複数テンプレートマッチング

    OPENCVを使って複数の画像を検出したいです。 こちらのサイトのようなことをしたいです。こちらはMAT型です。 私の使っている型ではうまくいきません。 http://workpiles.com/2015/05/opencv-matchtemplate-java/ 私のソースコードは下記の型を使用しております。 この型で複数マッチングするにはどうしたらよいでしょうか。 どなたかご教授いただけないでしょうか。 http://opencv.jp/sample/matching.html 

  • opencvの関数の中身をみることができますか?

    opencvの、たとえば「cvAdd」や「cvAbs」などの関数がどういったアルゴリズムで計算しているか知りたのですが、見ることは可能でしょうか? openCVの関数の中身を参照することはできますか? http://okwave.jp/qa/q5365660.html この質問を見た所canny関数は「cvcanny.cpp」で見ることが可能なようですが「cvAdd.cpp」などのファイルがないため、これらの中身を見る方法がわかりません。

  • OpenCVの画像表示について。

    OpenCVにて画像処理ソフトをつくっています。 VC++で、まず簡単に開くボタンから画像を開き、ピクチャーボックス、またはウィンドウに画像を表示するものを作ろうと思います。 しかし、ソースの中にファイル名を指定することでしか画像を開く方法しか方法がわかりません。 どのようにしてボタンを設置すればよいのでしょうか? また、プロジェクトの種類はWin32だけでしか作れないのでしょうか? OpenCVを使い始めたばかりの者でとても的外れな質問だとは思いますが、どうぞよろしくお願いいたします。

  • OpenCVの正解生成のcreatesamples

    OpenCVの正解画像生成のopencv_createsamples.exeが複数の画像だと何回やってもうまくいきません。 まず、作業ディレクトリが<C:\Documents and Settings\ユーザー名>だとし<C:\DocumentsandSettings\ユーザー名>に正解ファイル(OKファイル)に107枚の正解画像がありこれは全て70X70ピクセルで四角に加工しています。 opencv_createsamples.exeも<C:\Documents and Settings\ユーザー名>にコピーしています。 -info で読み出すtxtの書き方は OK\img1.bmp 1 0 0 70 70 ~ OK\img107.bmp 1 0 0 70 70 コマンドプロプントでの書き出しは C:\Documents and Settings\ユーザー名>C:\abc\opencv_createsamples.exe -info C:\abc\OK.txt -vec C:\abc\aaa.vec -num 1000 -w 24 -h 24 でEnter C:\Documents and Settings\ユーザー名>opencv_createsamples.exe -info OK.txt -vec aaa.vec -num 1000 -w 24 -h 24 Info file name: OK.txt Img file name: (NULL) Vec file name: aaa.vec BG file name: (NULL) Num: 1000 BG color: 0 BG threshold: 80 Invert: FALSE Max intensity deviation: 40 Max x angle: 1.1 Max y angle: 1.1 Max z angle: 0.5 Show samples: FALSE Width: 24 Height: 24 Create training samples from images collection... OK.txt(108) : parse errorDone. Created 107 samples vecファイルは出来ていますがShowで経過を見ていたら107枚で OK.txt(108) : parse errorDone. Created 107 samplesが出てしまいました。 わかる方いらっしゃいましたら、アドバイスお願いします。