• 締切済み

OpenCVで画像を読み込みたい

OpenCVを勉強しようと思い先日始めました。 http://chihara.naist.jp/opencv/?FrontPage 上記のサイトに掲載されている通りにVC++ 2008 EEで ・環境変数PATH ・インクルードファイル ・ライブラリファイル ・リンカ の設定をしました。 これでいざプログラムをコンパイルして実行すると何故か画像が読み込んでくれません。 これらの設定以外の他にするべきことがあるのでしょうか? いきなり出鼻を挫かれたので困っています。よろしくお願いします。 OS:XP SP2 開発環境:VC++ 2008 EE 実行したプログラム ---------------------------------------------------------------- #include "cv.h" #include "highgui.h" int main( int argc, char** argv ) { IplImage* img; char* filename = "abc.bmp"; if( argc == 2 && (img = cvLoadImage( filename, 1)) != 0 ) { cvNamedWindow( "Image view", 1 ); cvShowImage( "Image view", img ); cvWaitKey(0); // イベント処理を含む場合には,これが重要. cvDestroyWindow( "Image view" ); cvReleaseImage( &img ); return 0; } return -1; } ----------------------------------------------------------------

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

『abc.bmp』はどこにおいてあるのでしょう? エクスプローラ(マイコンピュータ)から起動するのなら EXEファイルと同じフォルダー VC2008の統合環境(IDE)から動かすのであれば CPPファイルなどと同じフォルダーにおきましょう

zscaxd225
質問者

お礼

回答ありがとうございます。 『abc.bmp』はcppファイルと同じフォルダに置いてあります。 別のパソコンで.NET2003で同様に実行したのですが、問題なく画像が表示されました。 そのソリューションファイルを自分のパソコンに移動し、VC++2008用に変換すると問題なく画像が表示されました。 また、友人のパソコン(VC++2008)でも画像が表示されました。 これは自分のVC++2008の設定が何かおかしいのでしょうか?

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

argc == 2 ということはコマンドプロンプトから引数をつけて起動することを期待しているプログラムです VisualC++から起動しているとしたら動かないのは正常です if( argc == 2 && (img = cvLoadImage( filename, 1)) != 0 ) を if((img = cvLoadImage( filename, 1)) != 0 ) にしたらどうでしょう

zscaxd225
質問者

お礼

回答ありがとうございます。 早速アドバイス通りにプログラムを変更して実行しました。 プログラム '[2260] cv_2008.exe: ネイティブ' はコード -1 (0xffffffff) で終了しました。 上のように表示されるので、画像が表示されないので失敗してるのだと思います。 cvLoadImageで画像が読み込めてないのか、変数imgに値が格納されていないのか…。 最早お手上げ状態です。

関連するQ&A

  • 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】BGRからHSVへの画像変換

    OpenCVを使って任意の画像データをBGR表色系からHSV表色系に変換するプログラムです。 コンパイルして実行してみたところ、添付画像のように元画像とは色味が異なった画像が出力されてしまいます。 他の画像ファイルを使ってみましたが結果は同じでした。 HSVへの変換がうまくいってないのでしょうが、調べても原因は分かりませんでした。 どなたか分かる方がいらっしゃいましたらご指摘お願いします。 以下にコードを載せます。 #include <cv.h> #include <highgui.h> int main (int argc, char **argv){ IplImage *src_img=0; // 入力画像 IplImage *hsv_img=0; // hsvに変換された画像 // (1)画像を読み込む src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); // (2)読み込んだ画像をhsvに変換する hsv_img = cvCreateImage (cvGetSize (src_img), IPL_DEPTH_8U, 3); cvCvtColor (src_img, hsv_img, CV_BGR2HSV); // (3)画像を表示,キーが押されたときに終了 cvNamedWindow ("Source_Image", CV_WINDOW_AUTOSIZE); cvNamedWindow ("HSV_Image", CV_WINDOW_AUTOSIZE); cvShowImage ("Source_Image", src_img); cvShowImage ("HSV_Image", hsv_img); cvWaitKey (0); // (4)メモリ解放 cvDestroyWindow ("Source_Image"); cvDestroyWindow ("HSV_Image"); cvReleaseImage (&src_img); cvReleaseImage (&hsv_img); return 0; } OS:Windows7 OpenCVのバージョン:2.1 添付画像で用いた画像の形式:png

  • C++でOpenCV コンパイルでエラー

    超初心者です。 Visual C++2010 ExpressでOpenCVを使おうとしています。 このページを参考にしています。 http://gihyo.jp/dev/feature/01/opencv/0002?page=2 プログラムは以下の通り。 #include <C:\Program Files (x86)\opencv\build\include\opencv\cv.h> #include <C:\Program Files (x86)\opencv\build\include\opencv\highgui.h> int main(int argc, char* argv[]) { IplImage* img; // 画像ファイルポインタの宣言 char imgfile[] = "lena.jpg"; // 読み込み画像ファイル名 // 画像の読み込み img = cvLoadImage(imgfile, CV_LOAD_IMAGE_COLOR); // 画像の表示 cvNamedWindow ("lena", CV_WINDOW_AUTOSIZE); cvShowImage ("lena", img); cvWaitKey (0); cvDestroyWindow("lena"); // 画像の解放 cvReleaseImage(&img); return 0; } コンパイルすると、以下のエラーメッセージが出ます。 1>------ ビルド開始: プロジェクト: try, 構成: Debug Win32 ------ 1> try.cpp 1>c:\program files (x86)\opencv\build\include\opencv\cv.h(63): fatal error C1083: include ファイルを開けません。'opencv2/core/core_c.h': No such file or directory ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== どのようにすれば通るのでしょうか? 教えてください。よろしくお願いします。

  • OpenCVのエラーが取れません。

    VC++にてOpenCVを使って画像処理を行っています。 cvHoughCircles関数を使ってハフ変換による円検出をしているのですが、 「Null pointer(NULL array pointer is passed)  in function cvGetMat,C\User\VP\opencv\cxcore\src\cxarry.cpp(2780)  Press"Abort"to terminate application. Press"Retry"to debug(if the app is running under debugger). Press"Ignore"to continue(this is not safe).」 というエラーが出てしまいます。 これはいったいどういったエラーなのでしょうか? プログラムは以下の通りです。 //-------------------------------------------------- #include <stdio.h> #include <cv.h> #include <highgui.h> int main (int argc, char **argv) { int i; float *p; IplImage *src_img = 0, *src_img_gray = 0; CvMemStorage *storage; CvSeq *circles = 0; char *filename = "lena.jpg"; IplImage *image; //画像の読み込み・平滑化・二値化 image = cvLoadImage(filename, 0); // 0: グレイスケールで読み込む // (2)ハフ変換のための前処理(画像の平滑化を行なわないと誤検出が発生しやすい) cvSmooth (src_img_gray, src_img_gray, CV_GAUSSIAN, 11, 11, 0, 0); storage = cvCreateMemStorage (0); // (3)ハフ変換による円の検出と検出した円の描画 circles = cvHoughCircles (src_img_gray, storage, CV_HOUGH_GRADIENT, 1, 100, 20, 50, 10, MAX (src_img_gray->width, src_img_gray->height)); for (i = 0; i < circles->total; i++) { p = (float *) cvGetSeqElem (circles, i); cvCircle (src_img, cvPoint (cvRound (p[0]), cvRound (p[1])), 3, CV_RGB (0, 255, 0), -1, 8, 0); cvCircle (src_img, cvPoint (cvRound (p[0]), cvRound (p[1])), cvRound (p[2]), CV_RGB (255, 0, 0), 3, 8, 0); } // (4)検出結果表示用のウィンドウを確保し表示する cvNamedWindow ("circles", 1); cvShowImage ("circles", src_img); cvWaitKey (0); cvDestroyWindow ("circles"); cvReleaseImage (&src_img); cvReleaseImage (&src_img_gray); cvReleaseMemStorage (&storage); return 0; } //----------------------------------------------------- 解決方法など分かりましたら、よろしくお願いいたします。

  • opencvについて

    OpenCVの初歩のプログラムなんですが実行するとコマンドプロンプトと実行画面が出てきます。しかし実行画面には何も映りません。エラーも出ず、正しくビルドされています。使用しているwebカメラはMicrosoft社の「LifeCam VX-1000」です。初期設定も正しく設定しました。参考にしているものは、「OpenCV プログラミングブック 第2版」です。どなたかアドバイスお願いします。 プログラム↓ #include <stdio.h> #include <highgui.h> int main(int argc, char** argv) { CvCapture *capture; IplImage *frameImage; char windowNameCapture[] = "Capture"; capture = cvCreateCameraCapture(0); cvNamedWindow(windowNameCapture, CV_WINDOW_AUTOSIZE); while (1) { frameImage = cvQueryFrame(capture); cvShowImage(windowNameCapture, frameImage); if (cvWaitKey(33) == 'q') break; } cvReleaseCapture(&capture); cvDestroyWindow(windowNameCapture); return 0; }

  • OpenCV2.3 のエラー

    Open CV2.3をVisual Studio2013 expresssに設定しました。 が、プログラムを実行すると 「エラー 3 error LNK1107: ファイルが無効であるか、または壊れています: 0x10B000 を読み取れません。 C:\Program Files\opencv\build\x64\vc10\staticlib\IlmImf.pdb...」 と表示されてしまい、困っています。 エラー原因は[リンカー]-[入力]-[追加の依存ファイル]の設定でしょうか。 当初、libとstaticlibフォルダの中にある、拡張子pbdを含む、重複なしのすべてのファイルを[追加の依存ファイル]に設定していましたが、これがエラーの原因かと思い、 libとstaticlibフォルダ内の、拡張子libのみに修正しました。 が、同じエラーが依然として出ています。 プログラムは以下の内容で、単純に画像を表示させるだけのものです。 ============================================= #include <cxcore.h> #include <cv.h> #include <highgui.h> int _tmain(int argc) { IplImage *src_img = 0, *dst_img; // (1)画像を読み込む src_img = cvLoadImage("C\\Users\\...\\thNDM091S8.jpg", CV_LOAD_IMAGE_COLOR); // (6)画像の表示 cvNamedWindow("Fitting", CV_WINDOW_AUTOSIZE); cvShowImage("Fitting", src_img); cvWaitKey(0); cvDestroyWindow("Fitting"); cvReleaseImage(&src_img); return 0; } ============================================== どこを直せばいいでしょうか。 いろいろと調べましたがわかりませんので、教えていただけると助かります。 よろしくお願いいたします。

  • OpenCV2.0でView Morphing

    環境はVisual Studio 2008 Express, OpenCV2.0です。 サポートされない実験的な関数にあるビューモーフィング関数を使い、2枚の画像から中間の画像を生成し、ウインドウに表示させるプログラムを作りたいです。 このpdfファイル(http://www.hci.otago.ac.nz/downloads/ViewMorphing_full.pdf)内の「10. Appendix B - Image Morphing in OpenCV」という箇所にあるコードを、以下のような定型文で囲んでみたんですけど、コンパイル時に分からないエラーが沢山出てきて解決できずに困っています。 どこか根本的な部分が抜けていて間違っているような気がするので、あらかじめ必要な宣言が抜けているとか、間違っていることに気づいた方がいらっしゃれば何でもいいので教えてください。よろしくお願いします。 #include <cv.h> #include <highgui.h> #include <cvaux.h> #pragma comment(lib, "cv200.lib") #pragma comment(lib, "highgui200.lib") #pragma comment(lib, "cvaux200.lib") int main(int argc, char** argv[]) { IplImage* morphedImage; IplImage* leftImage; IplImage* rightImage; cvNamedWindow("出力画像"); leftImage = cvLoadImage("left.jpg"); rightImage = cvLoadImage("right.jpg"); //------------------------------------------- ここに処理を入れる //------------------------------------------- // 表示ウインドウに画像を表示 cvShowImage("出力画像", _morphedImage); // キー入力待機 cvWaitKey(0); //表示ウインドウの破棄 cvDestroyWindow("出力画像"); cvReleaseImage(&leftImage); cvReleaseImage(&rightImage); cvReleaseImage(&morphedImage); //画像領域の解放 return 0; }

  • OpenCVで32bit ヘッダ無しRaw画像表示

    OpenCVのIPLimage構造体にヘッダ無しRaw画像を読み込んで表示させたいのですが、OpenCVではヘッダ無しRaw画像を直接読み込む関数がないため(cvLoadImageは対応せず)自作しなければいけません。まだCプログラムを勉強し始めたばかりなのでなかなか上手くいかなくて困っております。どなたか教えていただけませんか?ここまで作っみました。コンパイルはできますが、原画像どおり表示してくれません。扱う画像はレントゲン画像で512*512 32bit実数データです。 #include <cv.h> #include <highgui.h> #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> int main(int argc, char *argv[]) { char infile[512]; /* (1) */ float *inputimg; /* (3) */ int i, j; int mszx, mszy; FILE *fp; IplImage* img; strcpy(infile,argv[1]); mszx = atoi(argv[2]); mszy = atoi(argv[3]); static const char* title="display"; inputimg = (float*)malloc(mszx*mszy*sizeof(float)); if((fp=fopen(infile,"rb")) == NULL) { printf("OPEN FAILED %s\n",infile); exit(0); } fread(inputimg, sizeof(float), mszx*mszy, fp); fclose(fp); img = cvCreateImage(cvSize(512,512),IPL_DEPTH_32F,1); cvSetZero(img); for (j = 0; j < mszy; j++) { for (i = 0; i < mszx; i++){ img->imageData[mszx * j + i] = inputimg[mszx * j + i]; } } cvNamedWindow(title,CV_WINDOW_AUTOSIZE); cvShowImage(title,img); cvWaitKey(0); cvDestroyWindow(title); cvReleaseImage(&img); return 0; } ここまでしかできませんでした。

  • OpenCVでRAW画像(カラー)を開くには

    OpenCVを使って、テキスト形式のヘッダーありのRAW画像(カラー)を、Cで書いたプログラムで開きたいのですが、 うまくいかず困っています。 “LoadRawImage”というWindowが起動しますが、真黒で何も表示されません。 RAW画像を開く関数myRawImageは以下のurlの「RAWデータの読み込みと表示」を参照させていただきました。(すみません、どうもありがとうございます。) http://wiki.livedoor.jp/mikk_ni3_92/d/raw%a5%c7%a1%bc%a5%bf%a4%ce%c6%c9%a4%df%b9%fe%a4%df%a4%c8%c9%bd%bc%a8 画像サイズはわかっているので、bmpなどに変換せず、RAWのまま開きたいのですが、どこを直せばいいのでしょうか。 どなたかヒントでも教えていただけると大変助かります、どうぞよろしくお願い致します。 //test.cpp #include <cv.h> #include <highgui.h> #include <iostream> #include <fstream> #include "raw_data_show.h" int main (int argc, char ** argv)================= { int x, y,i; uchar p1[3], p2[3]; IplImage *img1, *img2, *cp_img; img1 = myRawImage("D:\\My Pictures\\...\rawimage",500,500,3); cvShowImage("Load RawImage",img1); cvWaitKey(0); ============================================== #include <cv.h> #include <cxcore.h> #include <highgui.h> #include <iostream> #include <fstream> IplImage *myRawImage(char *filename, int w,int h,int channels) { if((channels != 3) && (channels != 1)) { std::cerr << " channel is not 3 or 1\n"; return NULL; } std::fstream ifs(filename,std::ios::in|std::ios::binary); if(!ifs.is_open()) { return NULL; } CvMat *Mat = cvCreateMat(h,w,CV_8UC3); ifs.read(reinterpret_cast<char*>(Mat->data.ptr),w*h*3); ifs.close(); IplImage img_hdr; IplImage *dst_img = cvGetImage (Mat, &img_hdr); IplImage *clone = cvCloneImage(dst_img);//クローン作成 cvReleaseImage(&dst_img); cvReleaseMat(&Mat); if(channels == 3){ for (i = 0; i < size; i++) { for (j = 0; j < size; j++) { CvMat m; float ret = 0.0; float a[] = { float (j) / size, float (i) / size }; cvInitMatHeader (&m, 1, 2, CV_32FC1, a); ret = svm.predict (&m); switch ((int) ret) { case 1: rcolor = CV_RGB (100, 0, 0); break; case 2: rcolor = CV_RGB (0, 100, 0); break; case 3: rcolor = CV_RGB (0, 0, 100); break; } cvSet2D (img, i, j, rcolor); } } cvCvtColor(clone,clone,CV_RGBA2BGR); return clone; } ========================================================

  • OpenCVでサンプルコードを使うとエラーが出ます

    環境はVidualStudio2008、OpenCVは2.1のバージョンを利用しています。 OpenCVのテンプレートマッチングのサンプルを利用したところエラーが発生しました。 ソースは以下のものを使っています。 ところどころに入っているprintfは私が自分で入れたものですがこれが原因であるとは考えにくいのです。 エラーは添付したような画像で現れます。 またデバッグしたところ [下のフレームは間違っているか、または見つかりません。KernelBase.dll に対して読み込まれたシンボルはありません。] KernelBase.dll!76b7b9bc() このような文章も表示されました。 どうすれば解決できるでしょうか。 #include <cv.h> #include <highgui.h> int main (int argc, char **argv) { double min_val, max_val; CvPoint min_loc, max_loc; CvSize dst_size; IplImage *src_img, *tmp_img, *dst_img; argv[1]="○○"; argv[2]="○○"; argc=3; printf("1complete\n"); cvNamedWindow ("Image", 1); src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_COLOR); tmp_img = cvLoadImage (argv[2], CV_LOAD_IMAGE_COLOR); if(argc != 3 || (src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_COLOR))==0||(tmp_img = cvLoadImage (argv[2], CV_LOAD_IMAGE_COLOR))==0) return -1; printf("2complete\n"); // (1)探索画像全体に対して,テンプレートのマッチング値(指定した手法に依存)を計算 dst_size = cvSize (src_img->width - tmp_img->width + 1, src_img->height - tmp_img->height + 1); printf("2-1complete\n"); dst_img = cvCreateImage (dst_size, IPL_DEPTH_32F, 1);    //ここで動作停止 printf("2-2complete\n"); cvMatchTemplate (src_img, tmp_img, dst_img, CV_TM_CCOEFF_NORMED); printf("2-3complete\n"); cvMinMaxLoc (dst_img, &min_val, &max_val, &min_loc, &max_loc, NULL); printf("3complete\n"); // (2)テンプレートに対応する位置に矩形を描画 cvRectangle (src_img, max_loc, cvPoint (max_loc.x + tmp_img->width, max_loc.y + tmp_img->height), CV_RGB (255, 0, 0), 3); printf("4complete\n"); cvShowImage ("Image", src_img); printf("ALL COMPLETE!\n"); cvWaitKey (0); cvDestroyWindow ("Image"); cvReleaseImage (&src_img); cvReleaseImage (&tmp_img); cvReleaseImage (&dst_img); return 0; }

専門家に質問してみよう