openCVのエラー

このQ&Aのポイント
  • openCVの関数をOpenGLと組み合わせたプログラムで使用する際に、不正なチャンネル数のエラーが発生しています。
  • エラーが発生したプログラムでは、glutDisplayFuncとglutIdleFuncの中でcvCvtColor関数を使用しています。
  • openCV単体では正常に動作することが確認されていますが、OpenGLと組み合わせるとエラーが発生します。
回答を見る
  • ベストアンサー

openCVのエラー

openCVの関数で cvCvtColor(frameImage, hsvImage, CV_BGR2HSV); というRGBからHSVへ変換する関数を openGLと組み合わせたプログラムで使用していたところ, コンパイルは通るのですが実行すると Bad number of channels (Incorrect number of channels for this conversion code) in function cvCvtColor. C:\User\VP\opencv\cv\src\cvcolor.cpp(2440) と表示されてエラーとなります. いったい何が原因なのでしょうか?? ちなみに上記関数はopenCVのみのプログラムでは正常に 動作したのを確認しました. また,エラーが出たプログラムでは, glutDisplayFunc(display); glutIdleFunc(idle); //idleの中身はglutPostRedisplay(); としており,このdisplay()関数内にて 上記関数を使用したところこのような現象が起こりました. 分かる方がいらっしゃいましたら,ご回答よろしくお願いいたします.

  • vjpo
  • お礼率23% (17/71)

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

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

もう解決してしまわれたかな・・・? Bad number of channels (Incorrect number of channels for this conversion code) 訳すと 「チャンネル数が間違っています(この変換コードに合っていません)」 という感じになります。これは cvCvtColor(frameImage, hsvImage, CV_BGR2HSV); のframeImageかhsvImageのチャンネル数が変換コード(CV_BGR2HSV)に合ってないっていうことです。チャンネル数はRGBなら3色なので3、グレースケールなら1色なので1、というような感じになります。frameImageとhsvImageを IplImage* frameImage = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3); IplImage* hsvImage = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3);                                              ↑ここが重要 というように定義したかと思いますが、この最後の引数が3以外になってたりしてないですか?このあたりのソースコードを見てもらえると原因が分かるかなあと思います。参考までに・・・

vjpo
質問者

お礼

実はすでに解決していたのですが・・・ まさにそのとおりでした!!!! おもしろいくらいそのとおりでしたwww でも意味はわかっていなかったので、 勉強になりました!!ありがとうございました!!!

関連するQ&A

  • マウスクリックしたポイントのHSV値の表示方法

    VC++のMFCにて顔画像処理について研究中の者です。 マウスクリックしたポイントのHSV値をそれぞれ3つのEditControlに表示させようと考えています。 RGB値をHSVに変換させる方法は、OpenCVのcvCvtColor()関数を使って    cvCvtColor( frameImage,hsvImage,CV_BGR2HSV ); という風に変換させようと思っています。 クリックした位置のHSV値の表示方法を教えてください。 よろしくお願いいたします。

  • OpenCVでRGBをHSVに変換する

    いつもありがとうございます。 今OpenCVを使って画像の変換をしているのですが、エラーが出てしまい困っています。 cvCvtColor(src, gray_img, CV_RGB2GRAY); でグレースケールに変換するのはエラーは出ず実行結果が出てくるのですが、 cvCvtColor(src, hsv_img, CV_RGB2HSV); cvCvtColor(src, hsv_img, CV_HSV2RGB); このようにHSVに変換しようとすると、「ハンドルされていない例外が発生しました」とエラーが出てきて、実行できません。 HSV変換とグレースケール変換の違いがあるのではないかと思って調べているのですが、わかりません。 わたしの都合によりソースを載せることはできないのですが、何が間違っているか教えてもらえるとうれしいです。

  • 【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の動画書き込みのプログラムを作っているのですが・・・

    openCVの動画書き込みのプログラムを作っているのですが・・・ openCVで、読み込んだ動画(元動画)を背景差分法で2値化処理して出来た動画を保存する、というプログラムを作っています。 しかし、保存された動画を見ると、上手く書き込まれていません。というのも、元動画は15秒あるのですが、保存された動画を見ると、わずか2秒ほどで再生が終わってしまいます。 以下がプログラムのソースです。 #include <stdio.h> #include <cv.h> #include <cxcore.h> #include <highgui.h> #define THRESHOLD_MAX_VALUE 255 #define THRESHOLD 45 #define WIDTH 960 #define HEIGHT 540 int main( int argc, char **argv ){ int key; CvCapture *capture = NULL; IplImage *frameImage; IplImage *backgroundImage = cvCreateImage( cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 1 ); IplImage *grayImage = cvCreateImage( cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 1 ); IplImage *differenceImage = cvCreateImage( cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 1 ); IplImage *binaryImage = cvCreateImage( cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 1 ); double fps = 30.0; CvVideoWriter* VideoWriter = cvCreateVideoWriter("binary.avi", CV_FOURCC('F','L','V','1'), fps, cvSize(WIDTH, HEIGHT), 0 ); if ( ( capture = cvCreateFileCapture( "00011.avi" ) ) == NULL ) { printf( "File Not Found\n" ); return -1; } frameImage = cvLoadImage("haikei.bmp"); if(frameImage == NULL){ printf("Can't Get\n"); return -1; } cvCvtColor( frameImage, backgroundImage, CV_BGR2GRAY ); while ( 1 ) { frameImage = cvQueryFrame( capture ); if ( frameImage == NULL ){ break; } cvCvtColor( frameImage, grayImage, CV_BGR2GRAY ); cvAbsDiff( grayImage, backgroundImage, differenceImage ); cvThreshold( differenceImage, binaryImage, THRESHOLD, THRESHOLD_MAX_VALUE, CV_THRESH_BINARY ); cvWriteFrame(VideoWriter, binaryImage); key = cvWaitKey( 10 ); if ( key == 'q' ) { break; } } cvReleaseCapture( &capture ); cvReleaseVideoWriter( &VideoWriter ); cvReleaseImage( &backgroundImage ); cvReleaseImage( &grayImage ); cvReleaseImage( &differenceImage ); cvReleaseImage( &binaryImage ); return 0; } 抽出している際に、プロンプト画面に Compiler did not align stack variables.~ と出てきます。 また、非圧縮などでやると再生が出来ません。 PC環境はWindowsXPです。 助けてください!!

  • OpenCVによる時間差表示

    書き込みさせていただきます。 今OpenCVをインストールしてVC++にてプログラミングをしています。 カメラ画像を取得してそこに点を打とうとしています。 //中心 cvCircle(frameImage,cvPoint(320,250),1,CV_RGB(0,255,0),5,8,0); //右隅 cvCircle(frameImage,cvPoint(635,250),1,CV_RGB(0,255,0),5,8,0); //左隅 cvCircle(frameImage,cvPoint(5,250),1,CV_RGB(0,255,0),5,8,0); //上 cvCircle(frameImage,cvPoint(320,470),1,CV_RGB(0,255,0),5,8,0); //下 cvCircle(frameImage,cvPoint(320,5),1,CV_RGB(0,255,0),5,8,0); のようにして無理やり点を作って表示させることができました。 この点を 中心→0秒から5秒まで表示 右隅→5秒から10秒まで表示 左隅→10秒から15秒まで表示 のように時間をずらして表示するようなプログラムを作りたいのですが、やり方が調べてもよくわかりません。 教えていただければ幸いです。 よろしくお願いいたします。

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

  • OpenCVでのテンプレートマッチングについて

    質問させてください。 現在画像処理ライブラリのOpenCVを使ってテンプレートマッチングを用いた物体追跡しようと考えています。 今回作ってみたのですがどうしても、 「Bad argument(Array should be CvMat or IplImage)in function cvGetSize」 というエラーが出てしまいます。 おそらく画像の読み込みの部分だとは思うのですが・・・・ よろしくお願いします。 ソースプログラムは次のようになってます。 int main( void ) { int device1 = 0; int key=0; double max_interlinkage=0; double min_interlinkage=0; CvPoint max_point; CvPoint min_point; CvPoint corner_point; char windowNameTemplate[] = "Template"; // テンプレート画像を表示するウィンドウの名前 char windowNameDestination[] = "Destination"; // マッチング結果を表示するウィンドウの名前 //videoInputオブジェクト videoInput VI; //利用可能なキャプチャデバイス数を取得 int numDevices = VI.listDevices(); //キャプチャデバイスが見つからなかったら終了 if(numDevices == 0) { cerr << "[Error] Capture device not found!!" << endl; exit(-1); } //デバイス初期化(今回はデバイスID = 0,CAPTURE_WIDTH x CAPTURE_HEIGHTでキャプチャ) VI.setupDevice(device1, CAPTURE_WIDTH, CAPTURE_HEIGHT); IplImage *templateImage = cvLoadImage( "C:/Documents and Settings/ito/My Document/My Pictures/temp.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR ); IplImage *tempGray = cvCreateImage( cvGetSize(templateImage), IPL_DEPTH_8U, 1 ); if ( templateImage == NULL ) { // 画像が見つからなかった場合 printf( "画像が見つかりません\n" ); return -1; } cvCvtColor(templateImage,tempGray,CV_BGR2GRAY); IplImage *frameImage = cvCreateImage( cvSize(CAPTURE_WIDTH, CAPTURE_HEIGHT), IPL_DEPTH_8U, 3 ); // 画像用IplImage IplImage *grayImage = cvCreateImage( cvSize(CAPTURE_WIDTH, CAPTURE_HEIGHT), IPL_DEPTH_8U, 1 ); // 元画像をグレースケール化した画像用IplImage IplImage *dstImage = cvCreateImage( cvSize( frameImage->width - templateImage->width + 1, frameImage->height - templateImage->height + 1 ), IPL_DEPTH_32F, 1 ); // 相違度マップ画像用IplImage memcpy(frameImage->imageData, VI.getPixels(device1, false , true), frameImage->imageSize); cvCvtColor(templateImage,tempGray,CV_BGR2GRAY); //ループ開始 while(1){ //カメラ・デバイスから画像取得 memcpy(frameImage->imageData, VI.getPixels(device1, false , true), frameImage->imageSize); cvCvtColor(frameImage,grayImage,CV_BGR2GRAY); // テンプレートマッチングを行う cvMatchTemplate( grayImage, tempGray, dstImage, CV_TM_CCOEFF_NORMED ); // テンプレートが元画像のどの部分にあるのかという情報を得る cvMinMaxLoc( dstImage, &min_interlinkage, &max_interlinkage, &min_point, &max_point, NULL ); if(max_interlinkage>0.75){ corner_point=cvPoint(max_point.x+templateImage->width , max_point.y+templateImage->height); printf("point x=%d ",max_point.x+templateImage->width); printf("point y=%d ",max_point.y+templateImage->height); cvRectangle(frameImage , max_point , corner_point , CV_RGB(255,0,0) , LINE_THICKNESS , LINE_TYPE , SHIFT); printf("\n"); }else{ printf("point Lost\n"); } // ウィンドウを生成する cvNamedWindow( windowNameTemplate, CV_WINDOW_AUTOSIZE ); cvNamedWindow( windowNameDestination, CV_WINDOW_AUTOSIZE ); // 画像を表示する cvShowImage( windowNameTemplate, templateImage ); cvShowImage( windowNameDestination , frameImage ); //キー入力 key = cvWaitKey(1); if(key=='q'){ break; }else if(key=='c'){ cvSaveImage("image/frame.bmp",frameImage); } }

  • 右上の×を押したときに行う処理を意図的に書きたい

    今、OpenCVとOpenGLの両方を用いたプログラムを書いています。 OpenCVで物体を追跡したとおりにOpenGLで絵を動かそうとしており、 そのためには glutDisplayFunc(display); で呼び出しているdisplay()関数内で OpenCVを用いた画像処理プログラムを書く必要があると思っています。 しかし、cvCapture *captureなどとした場合、 cvReleaseCapture(&capture); などをプログラムの最後に行わなければなりません。 キーボードの「q」を打つことでメモリ解放および プログラムの終了をさせることができるのですが、 ウィンドウの右上の×を押しても同様の処理をさせたいと 考えています。 ウィンドウの右上の×を押してもcvReleaseCapture(&capture) などを行わせるにはどのように書けばよいのでしょうか?

  • opencvでのエラーが解決できません

    今、OPENCVで顔検出とSURFを組み合わせてプログラムを組んでいます。キャプチャ画像を顔検出してから検出された場所を切り出しSURFをかけようと考えています。 ビルドは成功するのですが、実行すると顔検出された瞬間に以下のエラーが出ます。 OpenCV Error: Null pointer (NULL array pointer is passed) in unknown function, file .\cxarray.cpp, line 2370 プログラムは while(1){ storage = cvCreateMemStorage(0); if( use_file_flag == 0 ) { if( captureImage == NULL ) continue; if( dstImage == NULL ) dstImage = cvCloneImage( captureImage ); } captureImage = cvQueryFrame(capture); cvCvtColor(captureImage, image, CV_BGR2GRAY); detect = cvCloneImage( dstImage2 ); //SURF特徴点抽出 cvExtractSURF( object, 0, &objectKeypoints, &objectDescriptors, storage, params ); cvExtractSURF( image, 0, &imageKeypoints, &imageDescriptors, storage, params ); cvSetImageROI( correspond, cvRect( 0, 0, object->width, object->height ) ); cvCopy( object , correspond ); cvSetImageROI( correspond, cvRect( 0, object->height, correspond->width, correspond-height ) ); cvCvtColor(dstImage, dstImage2, CV_BGR2GRAY); cvCopy( dstImage2, correspond ); cvResetImageROI( correspond ); /*if(*/ locatePlanarObject( objectKeypoints, objectDescriptors, imageKeypoints,imageDescriptors,src_corners, dst_corners );//) vector <int>ptpairs; findPairs( objectKeypoints, objectDescriptors, imageKeypoints, imageDescriptors, ptpairs ); MAX_P = (int)ptpairs.size()/2; //SURF照合結果表示 for(int i = 0; i < MAX_P; i++) {CvSURFPoint* r1 = (CvSURFPoint*)cvGetSeqElem( objectKeypoints, ptpairs[i*2] ); CvSURFPoint* r2 = (CvSURFPoint*)cvGetSeqElem( imageKeypoints, ptpairs[i*2+1] ); cvLine( correspond, cvPointFrom32f(r1->pt), cvPoint(cvRound(r2->pt.x), cvRound(r2->pt.y+object->height)), colors[8] ); } printf("%d\n", MAX_P); printf("%s\n", objectKeypoints); // 顔検出と描画 static CvScalar color = { 255, 255, 255 }; int j; int levels = 128; IplImage *small_img = cvCreateImage(cvSize( cvRound( captureImage->width /DOWNSCALE),cvRound( captureImage->height / DOWNSCALE )), 8, 1); IplImage *binary = cvCreateImage( cvSize( captureImage->width, captureImage->height ), 8, 1); cvThreshold(image,bi

  •  OpenCV2.1.0でのコンパイルエラーについて、質問があります。

     OpenCV2.1.0でのコンパイルエラーについて、質問があります。  初心者で至らない点があるかと思いますが、ぜひ回答よろしくお願いします。  動画キャプチャを再生するプログラムを作ろうと、DirectXを利用しています。  (Visual C++ 2010 expressを使っています)  インクルードファイルでの<cv.h>や<dshow.h>は、Microsofot windows SDK 6.1  やOpenCv2.1.0をインストールして、VC++ディレクトリ中の   インクルードファイル(*.h)は    c:\OpenCV2.1\include\opencv   ラ イブラリファイル(*.lib)は    c:\OpenCV2.1\lib   ダイナミックリンクライブラリ ファイル(*.dll)は    c:\OpenCV2.1\bin  (これは、”実行可能なファイル"のところへ)  設定して、コンパイルエラーは出ないようになりました。  しかし、   「インクルードファイル(*.h)は  c:\OpenCV2.1\include\opencv」  の処置のおかげで、同一フォルダに入っている   「cxtypes.h」と「cxoperations.hpp」の二つで、下記のようなコンパイルエラーが出ます。   エラーメッセージ > error C3862: /clr:pure または /clr:safe を伴うアンマネージ関数を   コンパイルできません  インラインのネイティブ アセンブリはマネージ コードで   サポートされていません >error C3645: : __clrcall は、ネイティブ コードにコンパイルされた関数  では使用できません  上のエラーから、clrの問題と考えて、.NET .Freamework 4.0(x68)を  新しくインストールしましたが、上のエラーが解決せず、コンパイルできません。  VC++ディレクトリ中のリンカーは、     strmiids.lib     cv.lib     cxcore.lib     highgui.lib     dxerr.lib     dxguid.lib     d3dx9.lib     d3dx10.lib     d3d9.lib     winmm.lib     comctl32.lib     strmbase.lib  にしました。  コンパイルエラーを解決する方法をご教示くださると、大変幸いです。  よろしくお願いします。