• 締切済み

定義されてないというので定義するとエラーが増えた

ARToolKitを卒研で使用するのにプログラムをいじっててどうしてもわからないことがあったので質問します。 環境はWindows7のVisualStudio2008です。 まず、このプログラムは以前別の方が作って完成したものです。 なぜ自分が今、いじっているかというと、このプログラムを使いたいとおもったところ卒研の論文に乗せていたものしかなく、さらにいくつかの文字において定義の部分が完全になくなっていたからです。 で、定義をして、エラーを消していくと最後にどうしても消せないエラーが出たのです。 そのエラーが以下のものです。 1>f:\卒検\プログラムセット\過去の\過去の\過去の.cpp(407) : error C2065: 'windowCV' : 定義されていない識別子です。 このwindowCVを使っているのはこの部分だけです。 cvShowImage( windowCV, lineE); 調べてみるとこのwindowCVは「const char *」という型だそうで、さっそく「const char *windowCV」と定義しました。 すると次はこのようなエラーが出ました。 1>f:\卒検\プログラムセット\過去の\過去の\過去の.cpp(168) : warning C4101: 'pt2' : ローカル変数は 1 度も使われていません。 1>f:\卒検\プログラムセット\過去の\過去の\過去の.cpp(167) : warning C4101: 'pt1' : ローカル変数は 1 度も使われていません。 1>f:\卒検\プログラムセット\過去の\過去の\過去の.cpp(148) : warning C4101: 'j' : ローカル変数は 1 度も使われていません。 1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\vector(220) : error C2129: 静的関数 'void keyEvent(unsigned char,int,int)' が宣言されましたが定義されていません。 1> f:\卒検\プログラムセット\過去の\過去の\過去の.cpp(48) : 'keyEvent' の宣言を確認してください。 プログラム内を検索したところ使用されていないというローカル変数は確かに宣言の部分にしかありませんでした。 一応「const char* windowCV」とも定義してみましたが結果は変わりませんでした。 この問題についてですが cvShowImage( "Hough", color_dst ); このような一文もあるのですが不思議なことにこちらは「Hough」の定義がどこにも書かれていないにもかかわらず、これについてのエラーは一つもありませんでした。 一体何が違うのでしょう? 回答については ・この問題の解決方法 ・「cvShowImage( "Hough", color_dst );」と「cvShowImage( windowCV, lineE);」の違いについて ・windowCVの定義の仕方について ・プログラム内にある問題点 を教えていただけると嬉しいです。 もちろん、それ以外のことも教えていただければ嬉しいです。 四つ目ですが、これより下には関係ありそうな部分を貼っておきます。 長いのでどこを乗せたらいいのかわからず関係あるかと思った一部のみとなってしまいますが、もしそこに原因があることがわかる方はぜひ教えてください。 必要があれば補足もいたします。 よろしくお願いします。 IplImage *src=cvCreateImage(cvSize(arImXsize, arImYsize),IPL_DEPTH_8U, 4); memcpy(src->imageData, dataPtr, src->imageSize); IplImage *Gray=cvCreateImage( cvGetSize (src),IPL_DEPTH_8U,1); cvCvtColor(src, Gray, CV_RGBA2GRAY); IplImage* dst = cvCreateImage( cvGetSize(Gray), 8, 1 ); IplImage* color_dst = cvCreateImage( cvGetSize(Gray), 8, 3); IplImage* lineE = cvCreateImage( cvGetSize(Gray), 8, 3); cvCanny( Gray, dst, 50, 200, 3 ); cvCvtColor( dst, color_dst, CV_GRAY2BGR ); cvCvtColor( dst, lineE, CV_GRAY2BGR);

  • hu2ki
  • お礼率45% (24/53)

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

卒研って、今年のですか?だとするとあと1月ないですが。 まず、このプログラムは、OpenCVというライブラリを利用しています http://opencv.jp/ C言語では、文字列は、「文字(char)の配列」として表現します。 "Hough"のように""で括ったものは「文字列リテラル」と呼ばれるもので、実際には 'H','o,'u,'g,'h','\0' と並んだ「配列」の「先頭アドレス」になります。 各要素はcharですが、文字列リテラルの内容は書き換えできない領域に置かれるのが普通なので、「変更できない」を表わす const charになります。 その先頭アドレスなので、ポインタになります。const char *型です。 C言語では、文字列、配列、ポインタの使い方が肝となります。 ここで挫折する人も多いところです。 せめて一通りの使い方を読んでやってほしいところです。 "Hough"を変数と勘違いしているようだと、「直したつもり」で逆に取り返しのつかない間違いにしていそうで。

hu2ki
質問者

お礼

回答ありがとうございます。 取り返しのつかない間違い、してそうで怖いですがこの質問については無事に解決しました。

回答No.2

コンパイラの仕様で違いますが はじめのコンパイルでは未定義の変数windowCVが出てきたのでコンパイラは途中でコンパイルを放棄します。 修正後はwindowCVについてはエラーが無くなったのでコンパイルが先まで進んだのでコンパイルの終了した関数の中で見つかった未使用のローカル変数をワーニングで知らせています。 keyEventのエラーは全く別の物でインクルードファイルとソースの間で齟齬があるのでは? コンパイルエラーを一つ潰すと潜在化していたエラー、ワーニングかぞろっと出てくるのはよく有ることです。

hu2ki
質問者

お礼

回答ありがとうございます。 以前作られたもので「これで完成形だ」と思い込んでいたのでこのような質問をしました。 この後ちゃんと対処できました。

noname#148582
noname#148582
回答No.1

> 「cvShowImage( "Hough", color_dst );」と「cvShowImage( windowCV, lineE);」の違いについて どうも定義と宣言がごっちゃになってる気がするんです。その説明は私も忘れました(汗) "Hough" はコレ自体で文字列変数ですよね。 windowCV ってのは文字列変数へのポインタな訳ですが、ダメって事はこれが存在しないと。 (引数としてのwindowCV はもちろん定義されてるでしょうけども。) const char *windowCV = "Hough"; cvShowImage( windowCV, lineE); と変数をまずは作成して、関数を呼べばOKでしょう。 #アカン。なんか説明できてないかも

hu2ki
質問者

お礼

回答ありがとうございます。 うまく定義することができました。

関連するQ&A

  • OpenCV2.4.6で色抽出を行いたい。

    Webカメラから取得した映像を用いて色抽出を行いたいです。 システム開発はVisual Studio 2012で言語はC++です。 OpenCV2.4.6を利用しているのですが、サンプルプログラムが古いバージョンで、OpenCV2.4.6では動かないので以下のプログラムを改良したいです。 参考にしたサイトはこちらです。 http://d.hatena.ne.jp/wah-wah-hawah/20090325/1237996168 以下プログラム #include <cv.h> #include <highgui.h> void GetMaskHSV(IplImage* src, IplImage* mask,int erosions, int dilations) { int x = 0, y = 0; uchar H, S, V; uchar minH, minS, minV, maxH, maxS, maxV; CvPixelPosition8u pos_src, pos_dst; uchar* p_src; uchar* p_dst; IplImage* tmp; tmp = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3); //HSVに変換 cvCvtColor(src, tmp, CV_RGB2HSV); CV_INIT_PIXEL_POS(pos_src, (unsigned char*) tmp->imageData, tmp->widthStep,cvGetSize(tmp), x, y, tmp->origin); CV_INIT_PIXEL_POS(pos_dst, (unsigned char*) mask->imageData, mask->widthStep, cvGetSize(mask), x, y, mask->origin); minH = 100; maxH = 115; minS = 80; maxS = 255; minV = 120; maxV = 255; for(y = 0; y < tmp->height; y++) { for(x = 0; x < tmp->width; x++) { p_src = CV_MOVE_TO(pos_src, x, y, 3); p_dst = CV_MOVE_TO(pos_dst, x, y, 3); H = p_src[0]; //0から180 S = p_src[1]; V = p_src[2]; if( minH <= H && H <= maxH && minS <= S && S <= maxS && minV <= V && V <= maxV ) { p_dst[0] = 255; p_dst[1] = 255; p_dst[2] = 255; } else { p_dst[0] = 0; p_dst[1] = 0; p_dst[2] = 0; } } } if(erosions > 0) cvErode(mask, mask, 0, erosions); if(dilations > 0) cvDilate(mask, mask, 0, dilations); cvReleaseImage(&tmp); } int main(int argc, char **argv) { int c; CvCapture* capture = 0; IplImage* frame = 0; IplImage* mask = 0; IplImage* dst = 0; if(argc == 1 || (argc == 2 && strlen (argv[1]) == 1 && isdigit(argv[1][0]))) capture = cvCreateCameraCapture(argc == 2 ? argv[1][0] - '0' : 0); frame = cvQueryFrame(capture); mask = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3); dst = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3); cvNamedWindow("src", CV_WINDOW_AUTOSIZE); cvNamedWindow("dst", CV_WINDOW_AUTOSIZE); while(1) { frame = cvQueryFrame(capture); GetMaskHSV(frame, mask, 1, 1); cvAnd(frame, mask, dst); cvShowImage("src", frame); cvShowImage("dst", dst); c = cvWaitKey(10); if(c == 'q') break; } cvDestroyWindow("src"); cvDestroyWindow("dst"); cvReleaseImage(&frame); cvReleaseImage(&dst); cvReleaseImage(&mask); cvReleaseCapture(&capture); return(0); }

  • OpenCV 2値化について

    いつもお世話になっております。 画像の2値化(黒は全てゼロ、白は全て255)をした画像bw_imgを用意して 左上端から11×11サイズのROIに切り取って決まった処理をかけていこうとしていますが、 2値化した画像をROIで保持させることができず、困っています。 int main() { //画像の2値化処理用変数 IplImage *src_img = 0, *dst_img = 0, *bw_img = 0; IplImage *src_img_gray = 0; IplImage *tmp_img, *out_img, *lap_img; CvMemStorage *storage = cvCreateMemStorage(0); CvSeq *contours = 0; // (1)画像を読み込み、グレースケール化(src_img_gray)、二値化(tmp_img) src_img = cvLoadImage("C:\\Users...\\サンプル画像\\sample.jpg", CV_LOAD_IMAGE_COLOR); tmp_img = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_8U, 1); src_img_gray = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_8U, 1);//もとはIPL_DEPTH_8U cvCvtColor(src_img, src_img_gray, CV_BGR2GRAY); cvAdaptiveThreshold(src_img_gray, tmp_img, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 7, 8); //11×11 走査用変数 dst_img = cvCreateImage(cvGetSize(tmp_img), IPL_DEPTH_8U, 1); bw_img = cvCreateImage(cvGetSize(tmp_img), IPL_DEPTH_8U, 1); out_img = cvCreateImage(cvGetSize(tmp_img), IPL_DEPTH_8U, 1); cvThreshold(tmp_img, bw_img, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); for (x = 0; x < bw_img->width; x++){ // x 座標を 1ピクセルずつ進める for (y = 0; y < bw_img->height; y++){ // y 座標を 1ピクセルずつ進める //(1) 11×11ピクセルに切り取って2値化する。 cvCopy(bw_img, dst_img); lap_img = cvCreateImage(cvSize(11, 11), IPL_DEPTH_8U, 1); CvMat *sub = cvCreateMatHeader(11, 11, CV_8UC1); cvGetSubRect(bw_img, sub, cvRect(y, x, 11, 11)); //コピー画像から11×11切り取り。 cvThreshold(sub, lap_img, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); //2値化、結果はlap_img. uchar iro = lap_img->imageData[lap_img->widthStep * (y + 6) + (x + 6)]; if (iro ==0){ →ここでどうみても黒なのにiroに「238」「71」などの値が入っています。 roiで切り取ったlap_imgが2値になっていません。 何が問題で2値化できていないのでしょうか。 どうすると2値化した画像(lap_img)を決まったサイズのウィンドウで扱えるでしょうか。 もしおわかりでしたらヒントでも結構ですのでぜひ教えてください。 よろしくお願いします。

  • 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 透明度について 透明度を表すRGBAのA(アルファチャネル)をいじって画像の透明にしたいのですが、いじってみてもなにも変化がありません。 なにが悪いのかわかりません ↓こんな感じでやってます。 // 画像を読み込む src_img = cvLoadImage(src_imgfile,CV_LOAD_IMAGE_COLOR); //RGBA変換 dst_img = cvCreateImage(cvGetSize(bg_img),IPL_DEPTH_8U,4); cvCvtColor(bg_img,dst_img,CV_RGB2RGBA); //透明度をいじる for ( int y = 0 ; y < dst_img->height ; y++ ) { for ( int x = 0 ; x < dst_img->width ; x++ ) { dst_img->imageData[dst_img->widthStep * y + x * 4 + 3] = -255; } }

  • C++プログラムの問題。。

    テンプレートマッチングというプログラムをやってますが、テンプレート画像にボックスカウンティング処理を行い、フラクタル次元を求めようという進み方で行こうと思って、プログラムを作ってみました。でもコンパイルするとエラーが出てきちゃいました。 int main(int argc, char* argv[]) { int x,y; int r,g,b; int wh=0,BC2=0,BC3=0,BC4=0,BC5=0,BC6=0; float p; char* filename = argc == 2 ? argv[1] : (char*) "apple.bmp"; if((src = cvLoadImage(filename,1)) == 0) return -1; IplImage *grayimg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,1); IplImage *edgeimg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,1); IplImage *img = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,3); IplImage *his = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,1); cvCvtColor(src,grayimg,CV_BGR2GRAY); cvEqualizeHist(grayimg,his); cvCanny (his,edgeimg,50,200,3); cvCvtColor (edgeimg,img,CV_GRAY2BGR); for(y=0;y< img->height;y++){ for(x=0;x< img->width ;x++){ getpixel(img,x,y,&r,&g,&b); if(r == white){ wh++; } } } p = (wh*100)/ (img->height * img->width); printf("height = %d width = %d\n",img->height,img->width); printf("white pixel = %d(%3.2f %%)\n",wh, p); (ここで x,y=1 x,y=2 x,y=4 x,y=5 と x,y=6 ももちろん入れてます) printf("log10(%d)/log10(2)=%1.4f\n",BC2,(log10(BC2)/log10 (2))); printf("log10(%d)/log10(3)=%1.4f\n",BC3,(log10(BC3)/log10 (3))); (ここでlog10(6)までの続きがあります) printf("((log10(%d)-log10(%d))/(log10(2)-log10(3)))=%1.4f\n",BC2,BC3,(log10(BC2)-log10(BC3))/(log10(2)-log10(3))); (ここでlog10(6)までの続きがあります) double fd,fd23,fd34,fd24,fd25,fd35,fd45,fd26,fd36,fd46,fd56; fd23 = -(log10(BC2)-log10(BC3))/(log10(2)-log10(3)); (ここでlog10(6)までの続きがあります) fd = ((fd23+fd34+fd24+fd25+fd35+fd45+fd26+fd36+fd46+fd56)/10); printf("フラクタル次元は%1.4fです\n",fd); 。 。 ここからはopenCVの関数が使ってます。 。 。 プログラムはこのようなんですが、コンパイルするとこのエラーが出てきました。 jikken2.cpp(528) : error C2668: 'log10' : ambiguous call to overloaded function c:\program files\microsoft visual studio 8\vc\include\math.h(569): could be 'long double log10(long double)' c:\program files\microsoft visual studio 8\vc\include\math.h(521): or 'float log10(float)' c:\program files\microsoft visual studio 8\vc\include\math.h(122): or 'double log10(double)' while trying to match the argument list '(int)' 誰かお分かりになる方々をぜひぜひお願いします。

  • Iplimageについて

    Iplimageについて プログラムを組み立てた際, 以下のエラー文がでてきます。 Null pointer(NULL array pointer is passed) in function cvGetMat, C:\user\VP\opencv\cxcore\src\cxarray.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). これが、 空のポインタを渡したとき 出るエラー文だとわかったのですが、以下のように組むと cvSaveImageのときにエラー文が発生します。 また、cvShowImageではエラー文は出ません。 (ただ、cvShowImageの場合、画像の大きさがディスプレイよりも 大きいために調整して出力されるので全体が見えません・・・) IplImage *src_img = 0, *dst_img = 0; src_img = cvLoadImage ("a.jpg", CV_LOAD_IMAGE_COLOR); //画像読み込み dst_img = cvCloneImage(src_img); //dst_imgを黒画像に for(int y = 0; y < dst_img->height ; y++) { for(int x = 0; x < dst_img->width ; x++) { dst_img->imageData[dst_img->widthStep * y + x * 3] = 0x00; dst_img->imageData[dst_img->widthStep * y + x * 3 + 1] = 0x00; dst_img->imageData[dst_img->widthStep * y + x * 3 + 2] = 0x00; } } cvSaveImage("test.jpg",dst_img); 空のポインタはcvCloneImageをすることで 回避できているのではと考えたのですが・・・ なぜエラーが発生するのかご教授よろしくお願いします。

  • c++のif文についてです。

    webカメラを使って肌色の面積を求めて、現在より1フレーム前の値と比較したいのですが、そのif文の部分がどのように書けば良いのかわかりません。 printf関数を使ってwebカメラで取得した肌色部分のピクセル数の前後を比較する場合(例えば、前のあたいより10倍以上大きかったら等)のif文の書き方をどなたかご教授お願いします。 以下ソースコードです。 #include "stdafx.h" #include <cv.h> #include <highgui.h> #include <time.h> #include <math.h> #include <string> int hsv=0; IplImage*mask = 0; CvSeq* contour = 0; void GetMaskHSV(IplImage* src, IplImage* mask,int erosions, int dilations) { int x = 0, y = 0; uchar H, S, V; uchar minH, minS, minV, maxH, maxS, maxV; CvPixelPosition8u pos_src, pos_dst; uchar* p_src; uchar* p_dst; IplImage* tmp; tmp = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3); cvCvtColor(src, tmp, CV_RGB2HSV); CV_INIT_PIXEL_POS(pos_src, (unsigned char*) tmp->imageData, tmp->widthStep,cvGetSize(tmp), x, y, tmp->origin); CV_INIT_PIXEL_POS(pos_dst, (unsigned char*) mask->imageData, mask->widthStep, cvGetSize(mask), x, y, mask->origin); minH = 100; maxH = 120; minS = 70; maxS = 255; minV = 70; maxV = 255; for(y = 0; y < tmp->height; y++) { for(x = 0; x < tmp->width; x++) { p_src = CV_MOVE_TO(pos_src, x, y, 3); p_dst = CV_MOVE_TO(pos_dst, x, y, 3); H = p_src[0]; S = p_src[1]; V = p_src[2]; if( minH <= H && H <= maxH && minS <= S && S <= maxS && minV <= V && V <= maxV ) { p_dst[0] = 255; p_dst[1] = 255; p_dst[2] = 255; hsv++; } else { p_dst[0] = 0; p_dst[1] = 0; p_dst[2] = 0; } } } if(erosions > 0) cvErode(mask, mask, 0, erosions); if(dilations > 0) cvDilate(mask, mask, 0, dilations); printf("%d\n",hsv); if(){}←ここのif文がわかりません cvReleaseImage(&tmp); } int _tmain(int argc, _TCHAR* argv[]) { int key; CvCapture* src; IplImage* frame; cvNamedWindow("カメラ映像表示"); src = cvCaptureFromCAM(0); if(src == NULL){ printf("映像が取得できません。\n"); cvWaitKey(0); return -1; } frame = cvQueryFrame(src); mask = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U, 3); while(1){ frame = cvQueryFrame(src); cvShowImage("カメラ映像表示", frame); GetMaskHSV(frame,mask,1,1); cvDrawContours(frame, contour, CV_RGB (255, 255, 0), CV_RGB (0, 0, 0), 1, 1, CV_AA, cvPoint (0, 0)); key = cvWaitKey(33); if(key == 27) break; } cvDestroyWindow("カメラ映像表示"); cvReleaseCapture(&src); return 0; } 1フレーム前の値を変数に記憶して、その前の状態を記憶しておいた変数と hsv とを比較すればよいというアルゴリズムは想像できるのですが、その“1フレーム前の値”というのを、どのように表現していいかわからないのです・・

  • プログラムについて

    Opencvで作成したプログラムですが、コンパイルはできるのにエラーが出ます。助けてください。 #include <cv.h> #include <highgui.h> int main (int argc, char **argv) { int i; IplImage *src_img = 0, *src_gray = 0; const char *cascade_name = "haarcascade_frontalface_default.xml"; CvHaarClassifierCascade *cascade = 0; CvMemStorage *storage = 0; CvSeq *faces; static CvScalar colors[] = { {{0, 0, 255}}, {{0, 128, 255}}, {{0, 255, 255}}, {{0, 255, 0}}, {{255, 128, 0}}, {{255, 255, 0}}, {{255, 0, 0}}, {{255, 0, 255}} }; // (1)画像を読み込む if (argc < 2 || (src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_COLOR)) == 0) return -1; src_gray = cvCreateImage (cvGetSize (src_img), IPL_DEPTH_8U, 1); // (2)ブーストされた分類器のカスケードを読み込む cascade = (CvHaarClassifierCascade *) cvLoad (cascade_name, 0, 0, 0); // (3)メモリを確保し,読み込んだ画像のグレースケール化,ヒストグラムの均一化を行う storage = cvCreateMemStorage (0); cvClearMemStorage (storage); cvCvtColor (src_img, src_gray, CV_BGR2GRAY); cvEqualizeHist (src_gray, src_gray); // (4)物体(顔)検出 faces = cvHaarDetectObjects (src_gray, cascade, storage, 1.1, 3, 0, cvSize (20, 20)); // (5)検出された全ての顔位置に,円を描画する for (i = 0; i < (faces ? faces->total : 0); i++) { CvRect *r = (CvRect *) cvGetSeqElem (faces, i); CvPoint center; int radius; center.x = cvRound (r->x + r->width * 0.5); center.y = cvRound (r->y + r->height * 0.5); radius = cvRound ((r->width + r->height) * 0.25); cvCircle (src_img, center, radius, colors[i % 8], 3, 8, 0); } // (6)画像を表示,キーが押されたときに終了 cvNamedWindow ("Face Detection", CV_WINDOW_AUTOSIZE); cvShowImage ("Face Detection", src_img); cvWaitKey (0); return 0; }

  • 【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

  • ファイルへのデータ書き出しが出来なくて困っています。

    openCVを利用し、用意した画像1、画像2間のオプティカルフローを計算し、画像3に描画するというプログラムを組みました。 その過程での、オプティカルフローのx成分「vel_x」、y成分「vel_y」の値をテキストファイルに書き出したいのですが、それぞれ「003B3340」「003B33E0」と記録されるだけで(多分アドレス?)うまくいきません。 どなたか詳しい方、ご教授いただけると幸いです。 環境はWindows XP、Visual C++ .NET2003です。 以下にコードを示します。 #include <cv.h> #include <highgui.h> #include <stdio.h> #include <fstream> const char *imgA_file = "01.bmp"; const char *imgB_file = "02.bmp"; using namespace std; int main(int argc, char** argv){ IplImage *imgA_src = cvLoadImage( imgA_file, -1); //画像読み込み IplImage *imgB_src = cvLoadImage( imgB_file, -1); IplImage *imgA = cvCreateImage(cvGetSize(imgA_src), IPL_DEPTH_8U, 1); cvCvtColor(imgA_src, imgA, CV_BGR2GRAY); IplImage *imgB = cvCreateImage(cvGetSize(imgA_src), IPL_DEPTH_8U, 1); cvCvtColor(imgB_src, imgB, CV_BGR2GRAY); IplImage *vel_x = cvCreateImage(cvGetSize(imgA_src), IPL_DEPTH_32F, 1); //x,y方向の速度を記録するバッファを確保する IplImage *vel_y = cvCreateImage(cvGetSize(imgA_src), IPL_DEPTH_32F, 1); IplImage *imgC = cvCloneImage(imgA); //結果画像用に入力画像をコピーする cvCalcOpticalFlowLK( imgA, imgB, cvSize( 11, 11), vel_x, vel_y); //オプティカルフローを求める,第3引数:ウインドウサイズ ofstream ofx("vel_x.txt"); //vel_x, vel_y のデータをテキストへ書き込み string buf; ofx << vel_x << endl; ofstream ofy("vel_y.txt"); buf; ofy << vel_y << endl; /* FILE *fp1, *fp2; //vel_x, vel_y のデータをテキストへ書き込み fp1 = fopen("vel_x.txt", "w"); fp2 = fopen("vel_y.txt", "w"); fprintf(fp1, "%d", vel_x); fprintf(fp2, "%d", vel_y); fclose(fp1); fclose(fp2); const CvArr *m, *n; // FILE *fp1, *fp2; fp1 = fopen("vel_x.txt", "r"); fp2 = fopen("vel_y.txt", "r"); fscanf(fp1, "%d", &m); fscanf(fp2, "%d", &n); fclose(fp1); fclose(fp2); */ for ( int i=0;i<imgA->height;i+=10 ){ //結果画像の作成 for ( int j=0;j<imgA->width;j+=10 ){ int dx = (int)cvGetReal2D( vel_x, i, j); int dy = (int)cvGetReal2D( vel_y, i, j); cvLine( imgC, cvPoint( j, i), cvPoint( j+dx, i+dy), CV_RGB( 255, 255, 255), 1, 8, 0); cvRectangle( imgC, cvPoint( j+dx-1, i+dy-1), cvPoint( j+dx+1, i+dy+1), CV_RGB( 255, 255, 255), 1, 8, 0); } } cvSaveImage( "03.bmp", imgC); //画像保存 cvReleaseImage( &imgA); cvReleaseImage( &imgB); cvReleaseImage( &vel_x); cvReleaseImage( &vel_y); return 0; }

専門家に質問してみよう