• 締切済み

OpenCV をやってる初心者ですがOpenSURFで分からないことがあるので教えてください。

今OpenSURFのmain.cppをいろいろいじくろうとしています。 もともとOpenSURFであった #include "surflib.h" #include "kmeans.h" #include <ctime> #include <iostream> 以外に自分でヘッダ#include "image_size_change.h"を作りました。 そこでは、入力画像を640*480のサイズに変更するのが目的です。 新しく作ったヘッダではchange_sizeとういう関数をつくります。型名はIplImage * です。 そこでmain.cppではimageを読み込むcvLoadImageの下の行に画像サイズを変更する。change_sizeを読んで 変更した画像を返してもらいます。たぶんそこは合ってる気がしますが、分からないのは実行する度に画像のサイズが 前にあったのが残ったままで2回くらい実行して(Make -f Makefile)後初めて意図通りの挙動になります。 なぜなんでしょうか?? どなたか教えて下さい。お願いします. main.cppは別に添付します。 Makefileは以下です. # Indicates compilator to use CC = g++ # Specifies compilator options CFLAGS = -O3 -Wall `pkg-config --cflags opencv` -D LINUX LDFLAGS = LDLIBS = `pkg-config --libs opencv` # Files extensions .cpp, .o SUFFIXES = .cpp .o .SUFFIXES: $(SUFFIXES) . # Name of the main program PROG = surf # Object files .o necessary to build the main program OBJS = fasthessian.o integral.o main.o surf.o utils.o ipoint.o all: $(PROG) # Compilation and link $(PROG): $(OBJS) $(CC) $(LDFLAGS) -o $(PROG) $(OBJS) $(LDLIBS) .cpp.o: $(CC) $(CFLAGS) -c $< -o $@ clean: -rm -f $(PROG) -rm -f *.o までです。 そして自分の作ったヘッダimage_size_change.hは以下です。 IplImage *change_size(IplImage *img){ IplImage *change_img=img; change_img = cvCreateImage( cvSize(img->width,img->height),IPL_DEPTH_8U, 3); cvResize(img,change_img,CV_INTER_CUBIC); return change_img; }

みんなの回答

  • tomo_mu
  • ベストアンサー率0% (0/0)
回答No.1

変更する画像サイズ640x480はどこで指定しているのでしょうか? 上記ソースだと画像サイズはimgの画像サイズになって画像サイズはまったく変わらないと思います。 “2回くらい実行して・・・”の挙動となることがいまいちよくわかりませんが、cvCreateImageでサイズに直接640x480を指定したらダメですか? ちなみに2行目のchange_imgをimgで初期化するのはどのみち次のcvCreateImageで上書きされるので意味がないと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 複数のサブディレクトリを一緒にmakeして一つの実行ファイルを作成するには

    いま、Linuxの環境でC言語の勉強しています。 それで、makeを使ってコンパイル方法を調べているのですが、 ソースディレクトリとヘッダーディレクトリを分けて管理している場合に一緒にコンパイルさせる為のMakefileの書き方が分からず困っています。 現在は、同じディレクトリ内にソースファイルとヘッダーファイルが存在してます。ちなみに下記が今のMakefile内容です。 ご存知の方が記述方法もしくは参考サイトを教えて頂けますでしょうか。よろしくお願い致します。 ======================================================== program = test_pro objs = main.o test1.o test2.o CC = gcc CFLAGS = -g -Wall #suffixes_define_rule .SUFFIXES : .c .o $(program) : $(objs) $(CC) $(CFLAGS) -o $@ $^ #suffixes_rule .c.o : $(CC) $(CFLAGS) -c $< .PHONY : clean clean : $(RM) $(objs) #header_depend test1.o : test1.h test2.o : test2.h =====================================================

  • win版インテルコンパイラnmakeについて

    linux版インテルコンパイラ(icc)を使っているmakefileをwindows版インテルコンパイラ(icl)で使えるように書きかえているのですが、コマンドプロンプトでどうもnmakeがうまくいきません。 元のmakefileは、 CC = icc CFLAGS = -O3 -xSSE4.2 CFLAGS2 = $(CFLAGS) -openmp -openmp-report1 LIBS = -lm -liomp5 PROGRAM = foo.exe SRCS = foo1.c foo2.c foo3.c .c.o: $(CC) $(CFLAGS) -c $< .SUFFIXES: .c .o all : $(PROGRAM) $(PROGRAM) : ${OBJS} $(CC) $(CFLAGS) -o $@ ${OBJS} $(LIBS) foo1.o : foo1.c foo.h foo2.o : foo2.c foo.h $(CC) $(CFLAGS2) -c $< foo3.o : foo3.c foo.h clean: rm *.o rm $(PROGRAM) で、書き換えたmakefileは、 CC = icl CFLAGS = -O3 -QxSSE4.2 CFLAGS2 = $(CFLAGS) -Qopenmp # CFLAGS = -W -O3 LIBS = -lm -liomp5 PROGRAM = foo.exe SRCS = foo1.c foo2.c foo3.c .c.o: $(CC) $(CFLAGS) -c $< .SUFFIXES: .c .o all : $(PROGRAM) $(PROGRAM) : ${OBJS} $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) foo1.o : foo1.c foo.h foo2.o : foo2.c foo.h $(CC) $(CFLAGS2) -c $< foo3.o : foo3.c foo.h clean: rm *.o rm $(PROGRAM) です。(投稿の際に見づらかったためスペースや改行はいじってます) CFLAGS2の-openmpを-Qopenmpにしたのと $(PROGRAM)の行の${OBJS}を$(OBJS)にしたぐらいですがエラーが発生します。({}括弧を使っているとエラーが発生したため) エラーメッセージは NMAKE : warning U4006: 特殊マクロは定義されていません : '$<' です。 {}の括弧を()に修正したのも似たエラーが発生したからなのですが、 コマンドプロンプトだと特殊マクロは使えないのでしょうか?

  • 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の実行エラー

    OpenCVで下記の用なテストプログラムを作成しました。 --------------------------------------- #include <stdio.h> #include <cv.h> #include <cxcore.h> #include <highgui.h> #pragma comment(lib, "cv.lib") #pragma comment(lib, "cxcore.lib") #pragma comment(lib, "highgui.lib") int main(void) { unsigned char *Image; IplImage* img = NULL; IplImage* clone = NULL; // 画像読み込み img = cvLoadImage("image.bmp", -1); // 画像コピー clone = cvCloneImage(img); return 0; } --------------------------------------- ところが、実行すると --------------------------------------- Bad argument(Bad image header) in function cvCloneImage, D:\User\VP\openCV\cxcore\src\cxarray.cpp --------------------------------------- というエラーメッセージがでて実行することができませんでした。 OpenCVに付属していたsampleプログラムは動作しました。 // 画像コピー clone = cvCloneImage(img); の一文をコメントアウトするとエラーはなぜかでません。 このエラーはどうしてでるのでしょうか? OSはwindowsXP コンパイルはC++6.0とVS2005の両方で試しましたが同じ結果がでます。

  • OpenCVでの画像サイズ取得について教えてください。

    OpenCVでの画像サイズ取得について教えてください。 rawデータをjpgにして取得し、その画像を4分割したいのですがエラーが3つ出てしまいます。 環境はVisual Studio2008です。 いろいろと調べたのですが、原因や対策がはっきりわからず、書き変えてもNGで困っています。 エラー:その1 「error LNK2028:未解決のトークン(0A00007B)"extern "C" struct IplImage *_cdecl cvLoadImage(char const roi.obj*.int)"(cvLoadImage@@$$J0YAPAU IplImage@@PBDH@Z)が関数"int _codecl main(int,char * *)"(?main@@$$HYAHHPAPAD@Z)で参照されました。」 エラー:その2 「error LNK2019: 未解決の外部シンボル"extern "C" struct IplImage * codecl cvLoadImage(char const *.int)" (?cvLoadImage@@$$J0YAPAU IplImage@@PBDH@Z)が関数"int_codecl main(int, char * *)" (?main@@$$HYAHHPAPAD@Z)で参照されました。」 エラー:その3 「fatal error LNK1120: 外部参照2が未解決です] '================== #pragma warning(disable : 4819) #include <cv.h> #include <highgui.h> #include <stdio.h> #define DIVX (4) #define DIVY (4) #define DIVXY (DIVX*DIVY) int main (int argc, char **argv) { int w, h IplImage *img=0; img=cvLoadImage("C:\・・・\\testfile.jpg, CV_LOAD_IMAGE_GRAYSCALE); w = img->width - img->width % DIVX + DIVX; h = img->height - img->height % DIVY + DIVY; printf("幅は%w, 高さは%h です。 \n"); } '=============================================== 画像サイズを取得し、画像を4分割したあと、画素値を変更したいと思っています。 できればjpgに変換せず、rawデータそのものの精度の画像を直接扱いたいのですが、 その場合、cvLoadImageでどう表記すると実現できるのでしょうか。 また、OpenCVのグレースケールは、何チャンネルなのでしょうか。 プログラム経験はありますが、OpenCVを使うため、C言語の勉強も始めたばかりです。 なにか見当違いな質問をしていたら申し訳ありません。 お忙しいところすみませんが、もしどなたか解決策をアドバイスいただける方がいらっしゃると 大変助かります。 どうぞ宜しくお願い致します。

  • 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; } ----------------------------------------------------------------

  • VS2010追加のインクルードディレクトリについて

    ソリューションと同階層にソースファイルやヘッダーファイルを散乱させるのは汚いなと思い、フォルダに分けました。 例) .slnの階層     mainフォルダ        main.h        main.cpp     sampleフォルダ        sample.h        sample.cpp      abcdフォルダ        abcd.h        abcd.cpp      efghフォルダ        efgh.h        efgh.cpp するとヘッダーをインクルードする時にパスが増えてしまうのも嫌だなと思って、 プロパティ   C/C++     全般       追加のインクルードディレクトリー で作ったフォルダを全て指定しました。 そうしたら一応 main.cpp で #include "sample.h" だけで通るのですが いつも #include "s まで打つとsample.hが候補で出てきてたのですが出なくなってしまいました。 代わりに当然といえば当然ですが #include "sample/sample.h" は候補に出てきます。 追加のインクルードディレクトリーをしても 候補は直接出てくるようには出来ないのでしょうか? パスを全部書いてしまうと追加した意味がありません… これと同様の質問なのですが、 abcd.cpp で main.h をインクルードしたい時も 候補には出ず、../を打って出てくると思うのですが こちらも追加のインクルードディレクトリをしても直接出るようには出来ないのでしょうか? なにか変なことを言ってるような気がしてきましたが よろしければ教えて下さい。

  • opencvの練習

    今、練習でhttp://gihyo.jp/dev/feature/01/opencv/0004こちらのオブジェクト検出器を練習しているのですが 1>------ ビルド開始: プロジェクト: 練習, 構成: Debug Win32 ------ 1>gihyo.obj : error LNK2019: 未解決の外部シンボル _cvReleaseHaarClassifierCascade が関数 _main で参照されました。 1>gihyo.obj : error LNK2019: 未解決の外部シンボル _cvHaarDetectObjects が関数 _main で参照されました。 1>C:\Documents and Settings\ユーザー名\デスクトップ\練習2\Debug\練習2.exe : fatal error LNK1120: 外部参照 2 が未解決です。 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== エラーが出てしまって先に進めません。 何が悪いのか教えてください。 よろしくお願いします。 プログラムは #include "cv.h" #include "ml.h" #include "highgui.h" int main(int argc, char* argv[]) { /* 画像のロード */ char imgfile[] = "Test/IMG_0532.jpg"; IplImage* image = cvLoadImage( imgfile, 1 ); /* オブジェクトのロード */ CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( "gihyo_basic2.xml" ); CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* objs; int i; /* オブジェクト検出 */ objs = cvHaarDetectObjects( image, cascade, storage, 1.15, 2, CV_HAAR_DO_CANNY_PRUNING ); /* オブジェクト領域の描画 */ for( i = 0; i < objs->total; i++ ) { /* extract the rectanlges only */ CvRect obj_rect = *(CvRect*)cvGetSeqElem( objs, i ); cvRectangle( image, cvPoint(obj_rect.x,obj_rect.y), cvPoint((obj_rect.x+obj_rect.width), (obj_rect.y+obj_rect.height)), CV_RGB(255,0,0), 3 ); } /* 画像の表示 */ cvReleaseMemStorage( &storage ); cvNamedWindow ("result", CV_WINDOW_AUTOSIZE); cvShowImage( "result", image ); cvWaitKey(0); cvDestroyWindow("result"); cvReleaseHaarClassifierCascade( &cascade ); /* 結果の保存 */ cvSaveImage("result1.jpg", image); cvReleaseImage( &image ); return 0; }

  • 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で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; } ここまでしかできませんでした。