Forum

14 1月 2010 Under:

“Forum” への75件のコメント

  1. grandbleu より:

    はじめまして。これからOpenCVの利用を考えているのですが、
    OpenCVを用いて、傘をカメラの前で回したときの回転を検出することはできますでしょうか?
    どなたかご存じの方が居らっしゃれば、ご教授いただけましたら幸いです。
    何卒よろしくお願いいたします。

  2. chiled より:

    はじめまして。
    私は現在、OpenCV勉強中で、iPhoneアプリで使用する為に
    書籍等のサンプルを動かしていますが、armv6でしかビルドが通らない状態です。
    原因は、書籍サンプルのライブラリ(Universal Binary)に
    Armv7用のライブラリが入っていないためであることがわかりました。

    :Armv7でも使用できるようにライブラリを作成する方法をご教授いただけないでしょうか
    lipoの使用経験がなくどこにどのコードを入れて進めればよいのかもわかりません。

    :また、OpenCV2.3.1等では、iPhoneでもライブラリの作成を行わずとも
    xcodeで「libopencv_core.2.3.1.dylib」等を指定するだけでビルドできるのでしょうか?

    以上、2点、ご教授いただけましたら幸いです。
    何卒よろしくお願いいたします。

    • surbar より:

      はじめまして。
      chiledさんの目的を果たすためにはOpenCVをXcodeでビルドし,
      ライブラリを生成する必要があると思います。
      私はその方法でOpenCV2.3.0のライブラリを生成し、armv7で利用しています。
      (OpenCV2.3.1をうまくビルドできなかったので2.3.0を利用しています)

      目的達成までの手順は以下のような感じでしょう。

      1.OpenCVのソースをダウンロード(私は2.3.0を使っています)
      http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/

      2.CmakeでXcodeのプロジェクトを生成
      CMake,OpenCVで検索すればやり方は出てくると思います。
      3.生成したプロジェクトを開き、ライブラリをビルド

      ただビルドするとおそらくいろいろと怒られます。
      私の場合は、下のサイトを参考にしました。
      http://taichino.com/programming/2109

      この過程で大切だと思ったポイントを以下にまとめます。
      * ベースSDKをiOSにすること(デフォルトはMacになっている)
      * highguiやhaartrainingなどのいらないターゲットを消すこと
      * installスクリプトから削除したターゲットのインストール作業を取り除くこと
      * ビルド時に選択しているアーキテクチャ(iOS DeviceかiOS Simulator)毎にライブラリが作られること

      上4つは私の備忘録からのコピペなので分かりずらいと思いますが、
      どこかでつまずいたときはこれらのどれかが悪さをしているかもしれません。

      4.生成したライブラリをリンクさせて目的のソースをビルド。
      3の時点で
      iOSシミュレータ用のライブラリと、iPhone実機用のライブラリを作成するはずです。
      それぞれリンクを分けないとうまく作動しません。

      いろいろと説明が欠けているかもしれませんが、
      私はこんな感じで解決できました。

  3. masap より:

    初めまして.
    動画ファイルをオープンし、フレーム画像を1枚取得するプログラムを記述しています。
    ファイルのサイズが4GBを超えると、取得した画像が緑色になってしまいました。
    DLLには、PATHを通さず、実行ファイル直下においていますが、opencv_ffmpeg.dll(x64の場合は、opencv_ffmpeg_64.dll)を置いた場合は、緑色にならずに、正常に画像を取得できます。

    大きな動画ファイルを扱うときは、必ずopencv_ffmpeg.dllを使用しないといけないのでしょうか。
    どなたか似たような症状の経験がある方はいらっしゃいませんでしょうか?

    OS:Windows7 64bit
    OpenCVのバージョン:2.3.1
    開発環境:Visual C++ 2008
    動画ファイルは、非圧縮のAVIファイル

    以下にソースを記載いたします。

    #include “stdafx.h”
    #include
    int _tmain(int argc, _TCHAR* argv[])
    {
    cv::VideoCapture _Capture(“C:\\Temp\\test.avi”);
    cv::Mat frame;
    _Capture >> frame;
    cv::namedWindow(“image1″, CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
    cv::imshow(“image1″, frame);
    cv::waitKey(0);
    return 0;
    }

    どうが、宜しくお願いいたします.

  4. fndj より:

    初めまして.
    動画の隣接フレーム間でBRIEFデスクリプタのマッチングをする,という処理を繰り返し行うプログラムを作っているのですが,
    処理を繰り返すうちに落ちてしまいます.
    Debugモードのときは問題なく実行でき,Releaseモード時のみ問題が発生します.
    BruteForceMatcherでマッチングを実行するときに落ちているようなのですが,
    どなたか似たような症状の経験がある方はいらっしゃいませんでしょうか?

    OS:Windows7 64bit
    OpenCVのバージョン:2.3.1
    開発環境:Visual C++ 2010
    Intel C++ Compiler XE 12.1使用

    宜しくお願いいたします.

  5. ngt より:

    はじめまして、画像処理初心者です。
    OSはwindowsXPでOpenCV2.3です.
    さっそくcookbookにある「カメラ画像をキャプチャする」を実行してみたのですが,以下のように、拡張子が見つからない(指定されていない)というエラーがでました.
    「OpenCV Error: Unspecified error (could not find a writer for the specified extension) in unknown function, file \Users\vp\work\ocv\opencv\modules\highgui\src\loadsave.cpp, line 276」
    ソースコードをいかに示します.imwriteに何か拡張子を指定する引数を加えればいいのでしょうか?(調べては見ましたがよくわかりませんでした)お願いします。

    //
    #include “stdafx.h”
    #include
    #include
    #include
    #include

    #ifdef _DEBUG
    //Debugモードの場合
    #pragma comment(lib,”C:\\OpenCV2.3\\build\\x86\\vc10\\lib\\opencv_core230.lib”)
    #pragma comment(lib,”C:\\OpenCV2.3\\build\\x86\\vc10\\lib\\opencv_imgproc230.lib”)
    #pragma comment(lib,”C:\\OpenCV2.3\\build\\x86\\vc10\\lib\\opencv_highgui230.lib”)
    #else
    //Releaseモードの場合
    #pragma comment(lib,”C:\\OpenCV2.3\\build\\x86\\vc10\\lib\\opencv_core230d.lib”)
    #pragma comment(lib,”C:\\OpenCV2.3\\build\\x86\\vc10\\lib\\opencv_imgproc230d.lib”)
    #pragma comment(lib,”C:\\OpenCV2.3\\build\\x86\\vc10\\lib\\opencv_highgui230d.lib”)
    #endif

    int
    main(int argc, char *argv[])
    {
    cv::VideoCapture cap(0);
    // 様々な設定…
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
    // カメラがオープンできたかの確認
    if(!cap.isOpened()) return -1;

    cv::namedWindow(“Capture”, CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
    while(1) {
    cv::Mat frame;
    cap >> frame; // キャプチャ
    // 様々な処理
    // …
    cv::imshow(“Capture”, frame); // 表示
    if(cv::waitKey(30) >= 0)
    {
    cv::imwrite(“cap.jpg”, frame);
    break;
    }
    }
    }

    • ngt より:

      補足:すいません何故かインクルードの部位が抜けてます。追記させてください。

      #include “stdafx.h”
      #include
      #include
      #include
      #include

      です。

      • ngt より:

        なんどinclude部を書き込んでも何故か表示しません。よくわかりませんが、プログラムのインクルードは問題ないとおもいます

  6. yukichi より:

    私はOpenCV(2.1と2.3)のサンプルプログラムのstereo_match.cppというプログラムを使っていて、視差画像と3次元座標値群を出力させているのですが、どうもその2つの結果がかみ合わない気がします。視差画像に映ってる部分(例えば箱など)が座標値群に出てこないんです。どのようにすれば良いのかアドバイス頂けたら幸いです。また、この処理をやったことのある方がいましたらどのようにすればいいのか教えていただけないでしょうか?よろしくお願いします。

  7. iqverylow より:

    CODE BOOKの中に Bilateral Filter部分のコードはmedian filterのコードと同じのような気がします.

  8. クロスカントリー より:

    初めまして
    OpenCV 2.3でのテンプレートマッチングについての質問です.

    OpenCVで探索範囲を限定してテンプレートマッチングを行うためにはどのような方法があるのでしょうか?
    やはり,元の画像から探索範囲だけを切り抜いたのちにマッチングしなければならないのでしょうか?
    cv::goodFeaturesToTrackのようにROIで範囲を限定してやることはできないでしょうか?

    どうか知恵をお貸しください.
    宜しくお願い致します.

  9. cvdummy より:

    OpenCV2.0から2.3.1へ移行し、2.0で書いた顔認識プログラムがほぼそのままで2.3.1に流用できたのですが、CascadeClassifier::detectMultiScaleのアルゴリズム変更のせいか、同じ引数を渡して実行してみると、対象画像に顔がないときだけ非常に重くなるようになってしまいました。 2.0のときにこのような挙動はありませんでした。 ちなみに2.0はOpenMP対応版を使っています。
    このような挙動の回避手段をご存知の方がおられましたら、お教え願えれば幸いです。

  10. myuki より:

    はじめまして。
    バグと言うか現状の仕様だと思いますが、詰まったことがあったので報告します。

    C++ インターフェイスで subtract 関数(や他の類似の関数でも?)では配列などと Scalar を引数に取れるようになりましたが、Scalar_ を渡すと型が不一致になる assert が出ます。
    開発版では解消されるのでしょうか?

    例:
    //Scalar_ ave;
    Scalar ave;
    std::vector data;
    std::vector sub;
    (略)
    ave = cv::mean(data);
    cv::subtract(data, ave, sub); // ave が Scalar_ だとエラー

    with OpenCV 2.3.1, Visual C++ 2010 Express, Windows XP

  11. sugiyama より:

    saturate_castについて質問です。

    cv::saturate_cast(12.5)を実行した場合、戻り値は13を期待していたのですが、
    12に丸められてしまいます。

    リファレンスには、
    >パラメータが浮動小数点数であり,変換後の型が整数(8ビット,16ビット,32ビット)である場合,
    >この浮動小数点数は,まず最も近い整数値に丸められてから,必要ならば切り詰められます
    >(変換後の型が,8ビットあるいは16ビット整数の場合).
    とあるので、使い方を間違ているわけではないと思っているのですが。。。
    同じような問題に当たったことがある型はいるでしょうか?

    使用しているOpenCV環境は以下となります。
    OpenCV2.3(CMakeとVisual Studio 2005でビルド)
    Visual Studio2005
    Windows7

    • fukushima より:

      単純に飽和してるかどうかを判断した後にキャストしている処理かとおもうので12に良いのでは?と.四捨五入するにはcvRoundをつかうといいかと思います.

    • fukushima より:

      上記訂正です.私の環境でテストしてみたところ四捨五入ではなく0.5までは切り捨て,それ以上で切り上げになっているようです.(0.5は0,0.51は1)

      • sugiyama より:

        返信ありがとうございます。

        saturate_castのソースを追ってみたのですが、内部でcvRoundをコールしており、
        cvRoundの動作は、私の環境だとアセンブリ命令 fistpで小数点以下を丸めているようです。(コンパイル環境に応じて変わるようです。)
        この命令は、0.5を偶数方向に四捨五入しているするようです。

  12. t_todoroki より:

    私の勘違いであれば申し訳ないのですが、
    下記アドレス
    http://opencv.jp/sample/object_detection.html
    「物体検出」のサンプルコードにおいて、

    CvHaarClassifierCascade *cascade

    がメモリ解放されておらず、
    メモリリークを起こしているように見えます。

    プログラムの末尾に

    cvReleaseHaarClassifierCascade(&cascade);

    が必要ではないでしょうか?

    ご確認をよろしくお願いします。

  13. 服部 國彦 より:

    初めまして
    OpenCV.2.2を VC++ 2010 Expressで使おうとしています。

    「>C:\OpenCV2.2\include\opencv2/core/types_c.h(284): error C3862: ‘cvRound’: /clr:pure または /clr:safe を伴うアンマネージ関数をコンパイルできません1>
    インラインのネイティブ アセンブリはマネージ コードでサポートされていません」

    というメッセージが出てコンパイルできません。
    どうしたらいいかお教え頂けたら幸いです。

    • ふくだ より:

      こんにちは。
      プロジェクトのプロパティ->構成プロパティ->全般->共通言語欄タイプサポート->共通言語ランタイプサポート(/clr)に変更してみたら如何でしょう。
      自分も、ここが“純粋MSIL共通言語ランタイプサポート(/clr:pure)”だと、同様なエラーがでました。
      お試しください。

  14. AknEP より:

    些細ではありますが、イントロダクションのサンプルコードに誤りを見つけました。
    contrast_gain と定義されている変数が、後方でconstrast_gainとして呼び出されています。(後の方のsが余計です)。

    http://opencv.jp/opencv-2svn/cpp/introduction.html

    報告のみ、失礼します。

    • idojun より:

      ご指摘,有難うございます.あとで修正しておきます.

  15. mattsun より:

    はじめまして。
    2週間ほど前からOpenCVを勉強し始めたものですが、今カメラから取り入れた映像をAVIファイルに書き込むというプログラムを作って(『詳解OpenCV』の例題2-10を用いています)いるのですが、カメラをどのように指定したらよいのかがわからず、手詰まり状態なのですがどのようにしていしたらよいのか教えていただけますでしょうか?

    //ビデオを対数極座標に変換する
    //argv[1]:入力ビデオファイル
    //argv[2]:新しい出力ファイル名
    #include"stdafx.h"
    #include"cv.h"
    #include"highgui.h"
    
    int main(int argc,char* argv[])
    {
    	CvCapture* capture=0;
    	capture=cvCreateFileCapture(argv[1]);
    	if(!capture)
    	{
    		return -1;
    	}
    	IplImage *bgr_frame=cvQueryFrame(capture);
    	double fps=cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);
    	CvSize size=cvSize((int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT));
    	CvVideoWriter *writer=cvCreateVideoWriter(argv[2],CV_FOURCC('M','J','P','G'),fps,size);
    	IplImage* logpolar_frame=cvCreateImage(size,IPL_DEPTH_8U,3);
    
    	while((bgr_frame=cvQueryFrame(capture)) !=NULL)
    	{
    		cvLogPolar(bgr_frame,logpolar_frame,cvPoint2D32f(bgr_frame->width/2,bgr_frame->height/2),40,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS);
    		cvWriteFrame(writer,logpolar_frame);
    	}
    	cvReleaseVideoWriter(&writer);
    	cvReleaseImage(&logpolar_frame);
    	cvReleaseCapture(&capture);
    	return(0);
    }
    
  16. iino より:

    UVCカメラでキャプチャを行っています。
    ubuntu+OpenCV2.3.0ですが、2台のカメラをキャプチャ出来ません。
    (no space left on deviceというエラー)
    V4Lの問題のようですが、解決策はPCIのUSB拡張ボードを使えという程度しかありませんでした。
    仕方ないので、片方のカメラを閉じてもう片方のカメラを開いてという繰り返しを行ってみた所
    メモリリークしているようです。
    2個だからかなあと思って1個だけのカメラのオープンクローズを繰り返して見ましたが、現象は
    同じでした。
    どんどんメモリを食いつぶしていって最後にはエラーになります。
    こういう事をする例がないのですが、私が何か処理を忘れているのでしょうか?
    (それとも検証されていないバグなのか・・・)
    何か情報をお持ちの方、ご教授頂けると助かります。
    (他のバージョンでは起きないとか・・・)

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <opencv/cv.h>
    #include <opencv/highgui.h>
    #include <ctype.h>
    
    int main( int argc, char *argv[] ) {
      CvCapture *capture = 0 ;
      IplImage *frame = 0 ;
      int c ;
    
        cvNamedWindow( "Capture", CV_WINDOW_AUTOSIZE ) ;
        while(1) {
          capture = cvCaptureFromCAM( 0 ) ;
          frame = cvQueryFrame(capture) ;
          cvShowImage("Capture", frame ) ;
          cvReleaseCapture(&capture) ;
          c = cvWaitKey(30) & 0xff;
          if ( c == 'q' ) break ;
        }
        cvDestroyWindow("Capture") ;
        return 0 ;
    }
    
  17. kenji Nonomura より:

    市販のUSBカメラとそのトリガ入力を利用したいので、付属のSDKのサンプルで取込んだ画像をOpenCVへ変換したのですが、画像が1/9の大きさに表示されてしまいます。(横方向、縦方向 ともに1/3の大きさで 一番上側3画面のみ表示となります。)
    相手側はLPBYTE PBuffで、OpenCV側はchar *なので、下のようなプログラムにしました。
    何故、画像が小さくなるのか アドバイス頂けないでしょうか、よろしくお願いします。
    img = cvCreateImage(cvSize(640, 480), 8, 3);
    printf(“img->widthStep = %d\n”,img->widthStep);
    int y, x;
    for (y = 0; y height; y++) {
     for (x = 0; x width; x++) {
    /* 画素値を直接 copy */
       img->imageData[img->widthStep*y+x*3]
    =pBuff[img->widthStep*y+x*3];
       img->imageData[img->widthStep*y+x*3+1]
    = pBuff[img->widthStep*y+x*3+1];
    img->imageData[img->widthStep*y+x*3+2]
    = pBuff[img->widthStep*y+x*3+2];
    }
    }
    cvNamedWindow (“Image”, CV_WINDOW_AUTOSIZE);
    cvShowImage (“Image”, img);

    • suenaga より:

      USBカメラ画像の解像度や画像フォーマットが不明なので返答が難しいですが、USBカメラ画像がグレースケールなどBGR以外のフォーマットで取り込まれているということはないでしょうか?

      余談ですが、forループの条件に”<"が抜けてるのは転記ミスと信じるとして、画素のコピー部分は以下のように、OpenCVのIplImageではwidthStepを使って、pBuffにはwidthを使ったほうが良いと思います。(今回の解像度では問題ないと思いますが)

         img->imageData[img->widthStep*y+x*3]
      =pBuff[img->width*y+x*3];
         img->imageData[img->widthStep*y+x*3+1]
      = pBuff[img->width*y+x*3+1];
      img->imageData[img->widthStep*y+x*3+2]
      = pBuff[img->width*y+x*3+2];
      
  18. shinya より:

    サンプルコードの顔の検出 cvHaarDetectObjectsにてリンクエラーが発生。
    ディレクトリー、追加の依存ファイルにlibをネットを頼りに追加しましたが
    改善されません。環境は、WIN7とVC2010と2.20です。cvHaarDetectObjects
    の正しいヘッダファイルは、なんでしょうか?教示頂けるとたすかります。
    現在の記述
    #include
    #include

    error LNK2019: 未解決の外部シンボル _cvHaarDetectObjects が関数 _main で参照されました。

  19. matsumoto より:

    はじめまして、
    cvCreateImage関数を呼び出すと、なぜか別の配列が壊れます。
    環境はWin7(32bit)+VS2010+OpenCV-2.2.0-win32-vs2010.exeです。
    具体的には(定義部)

    #include <opencv2\core\core_c.h>
    #include <opencv2\highgui\highgui_c.h>
    struct VOXELDATA {
    	unsigned long width;
    	unsigned long height;
    	unsigned long depth;
    	unsigned short planes;
    	unsigned short bps;
    	unsigned short**** data; //これが壊れる
    } ;
    VOXELDATA* voxeldata;
    IplImage*	img;
    

    で、この段階ではvoxeldata->data[0][0][0][0]は正常に読めるのですが、次に
    img = cvCreateImage(cvSize(voxeldata->width, voxeldata->height), IPL_DEPTH_8U, voxeldata->planes);
    を呼ぶとvoxeldata->data[0]が0xccccccccに化け、volxeldata->[0][0][0][0]を読むとエラーになります。

    • idojun より:

      はじめまして.
      cvCreateImage()の呼び出しだけで,関係ないメモリ領域が破壊されることはないはずなので,おそらく原因は別にあると思うのですが….問題を再現(実行)できる最小限のコードを見せていただければ検証できるかもしれません.

      • まつもと より:

        単なるmallocでも配列が破壊されるのを確認しました。
        opencvの問題ではなさそうです。
        お騒がせいたしましたm(_ _)m

  20. yukichi より:

    はじめまして.
    私はOpenCV-2.1のサンプルプログラムのstereo_match.cppというプログラムを使ってるんですが,出力であるdepth画像はきれいに出るのですが3次元座標値がどうしてもうまく表示できません.obj形式で出力してjavaviewという3Dビューアを使って見てるんですが,いつも放射線状になってしまってdepth画像と対応してる点が見当たらないんです.

    自分でもいろいろ調べたのですが,何が良くて何が悪いのかよく分からないんでアドバイス頂けると幸いです.よろしくお願いします.

    • fukushima より:

      ソースを見てみましたが,出力はデプスではなく視差画像と各画素の3次元点(x,y,z)のプロットですね.saveXYZ()での出力を使っても駄目でしょうか?

      • yukichi より:

        返信ありがとうございます.私もソースをもう一度見てみたのですが,saveXYZはソースの中にあって使われてると思うんです.うーん…そもそもsaveXYZって3次元座標値を保存するものなんですよね??
        ほんと学習不足の意見で申し訳ないです…

        • fukushima より:

          放射線状となっていましたので,視差と奥行きが違っていたのかなとの推測で言っていました.saveXYZはreprojectImageTo3D関数を使って視差をxyzの3次元空間に投影する関数です.
          javaviewの入力フォーマットを知らないためこれ以上何とも言えませんが参考までに.

          • yukichi より:

            ほんといろいろありがとうございます.
            この3次元座標値さえきちんとした形で出力できれば,物体の形状を構成することができると思うんですけども…
            私がやろうとしている事は多方向から撮影し,視差画像と3次元座標値を使って様々な方向から撮影した画像をつなぎ合わせて1つの物体の形状をつくろうとしています.いわゆる形状計測です.他にこれをしたらいいよとかこれを使えばいいんじゃない的なアドバイスをもらえるとありがたいです.自分でもいろいろしてみるんですが出来が悪くて…頼りっぱなしですみません.

        • fukushima より:

          まずは,1枚のxyzがモデル化できるようになったら(ここのサンプルであるPoint Cloud renderingのサンプルではできているはずです.),次は複数のデプスマップや3次元座標を,xyzの座用系の統一やモデルの位置合わせ(ICPアルゴリズムなどを使う)を行えばできるはずです.ROSのPoint Cloud Libraryや東大の池内研究室の論文などを参考にするといいと思います.

          • yukichi より:

            いろんな情報ありがとうございます.
            早速,東大の池内研究室やPCLなんかも見ました.とても役に立ちそうです.
            ところでこのサイトにあるpoint cloud renderingってすごく私のやっていることに近いんですが,具体的に何をしているものなのですか?左右画像からマッチングをして,そのデプス画像に原画像をくっつけて立体的に表示してるんですよね?

  21. mmm より:

    openCVとopenGLを使用して、ARのようなカメラ映像の上に3Dモデルを描画したいのですが、ウインドウにカメラの映像が表示されなくて困っています。何か良い方法があれば教えて下さると助かります。よろしくお願いします。
    作業環境は以下の通りです。
    opencv1.1pre1、visualC++2008、wiandowsXP、glut3.7.6

    • idojun より:

      OpenCVで作成したウィンドウ内に,OpenCVでキャプチャしたカメラ画像が表示できない,という意味でしょうか?それでしたら,Web上に多くのサンプルがあると思うのですが,どの例で動かなかったのか示していただければ,何かアドバイスできることがあるかもしれません.

      • mmm より:

        openGLで作成したウィンドウに2Dの四角形を作り、テクスチャとしてカメラでキャプチャした画像を貼り付けるという風にして表示させようとしているのですが、うまくいきませんでした。四角形自体は表示されているので、テクスチャに変換するところに何か問題があるのではと私は思っています。

        • idojun より:

          OpenCV1.1をご利用とのことで,普段はIplImage構造体を使われていると思いますので,以下のimageをIplImageとして,

          glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image->width, image->height,0, GL_BGR, GL_UNSIGNED_BYTE, image->imageData);
          

          というように指定すればよろしいかと思います.

          • mmm より:

            すみません、試してみたのですがまだうまくいかないです。テクスチャが問題ないとすると、描画や表示の部分に問題があるのでしょうか?描画にはglEnable()を使っていて、表示にはglutSwapBuffers()を使っています。

          • idojun より:

            このような感じでいかがでしょうか.

            void display()
            {
              IplImage *image = cvLoadImage("../../image/lenna.png", 1); // load image
              GLuint text;
              glGenTextures(1, &text);
            
              glBindTexture( GL_TEXTURE_2D, text );
              glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
              glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
            
              glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
              glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image->width, image->height,0, GL_BGR, GL_UNSIGNED_BYTE, image->imageData);
            
              glEnable(GL_TEXTURE_2D);
              glBegin(GL_QUADS);
              glTexCoord2d(0.0, 1.0);   glVertex2d(-0.8,0.9);
              glTexCoord2d(0.0, 0.0);   glVertex2d(-0.9,-0.9);
              glTexCoord2d(1.0, 0.0);   glVertex2d(0.9,-0.8);
              glTexCoord2d(1.0, 1.0);   glVertex2d(0.7,0.7);
              glEnd();
              glDisable(GL_TEXTURE_2D);
            
              glFlush();
            }
            
            int main(int argc,char *argv[])
            {
              glutInit(&argc,argv);
              glutCreateWindow("test");
              glutDisplayFunc(display);
            
              glClearColor(0.,0.,0.,0.);
              glutMainLoop();
            
              return 0;
            }
            
  22. umr より:

    はじめまして、VideoWriterについて質問があります。
    使用環境は、
    Opencv2.2.0(コンパイル済のexeでインストール)/VisualStudio2010(C++)/WindowsXpです。
    ReleaseモードでVideoWriterを初期化する際に、CV_FOURCCでコーデックを指定すると、malloc.cの89行目でエラーが生じて実行できません。Debugモードでは問題なく録画が可能です。
    その後、自分でコンパイルしたdll・libファイルを試しましたが、状況変わらずでした。
    2.1.0を使っていたときは、コンパイル済みのexeをインストールしたときは、Release/DebugモードともにCV_FOURCCを使って録画可能でしたが、自分でコンパイルしたdll・libファイルを使うと何故かCV_FOURCCを使うと録画できなくなってしまいました。エラーは前述と同じです。
    原因・改善策について何か御存知でしたら、教えてください。

  23. kenji Nonomura より:

    画像のキャプチャについて質問します。
    トリガー端子付のUSBカメラを使い、トリガのタイミングで画像をキャプチャすることはできるかアドバイスをお願いします。下のようなプログラムでは常時、画像を取込めることは確認できています。
    よろしくお願いします。
    while (1) {
     src_img = cvQueryFrame (capture); // カメラから画像をキャプチャする
     cvShowImage (“生画像:Capture”, src_img);

    • idojun より:

      はじめまして.
      私はそのカメラ環境を持っておりませんので,お答えするのが難しいのですが,そのような高度なカメラには通常,専用のSDKが付属しているのではないでしょうか.もしそうでしたら,それでキャプチャを行い,取得した画像をOpenCVで利用できる形式に変換するというのが最も確実な気がします.
      OpenCV自体にはトリガを送信する機能はありませんし(そもそも,インタフェースも不明なわけですが),トリガが余所から送られたか否かを知る方法もないと思います.
      参考になれば幸いです.

  24. kita より:

    初めまして。
    私はこれからGPGPUを使おうと考えています。
    OpenCVも2.2でGPUを使うことが可能になりましたが、このモジュールを使うのはまだ時期尚早でしょうか?

    環境は整えましたが、
    gpu::threshold()関数でマニュアルと違う数の引数を求められて戸惑っています。

    実際にOpenCV2.2のGPUモジュールを使っておられる方はおられるのでしょうか?
    漠然とした内容で申し訳ないですが、アドバイス等有りましたらお願いします。

    • idojun より:

      はじめまして.
      私はGPGPUの機能を利用できる環境を持っていないので,実際のところGPUモジュールの完成度はよく分からないです.ご指摘のgpu::thresholdを見てみましたが,これはマニュアルのミスだと思います.
      実際には,

       double threshold(const GpuMat& src, GpuMat& dst, double thresh);
      

      と,定義されているようです.
      gpuモジュールの開発にはNvidiaのエンジニアも関わっているということなので,これから完成度も上がっていくと思われますが,どの辺で手を出すかは利用者次第だと思います.日本語圏内では,まだまだ利用者は少ないようですね.

  25. tetuya より:

    Opencv2.1.0のインストールについて質問があります。

    SourceForgeからダウンロードしてきたものに入っている、Opencv2.1.0/src/highguiの中のC/C++ファイル(cvcapファイル)をすべてインストールしたいのですが、どうすればよいでしょうか。

    idojun様のOpencv2.0.0インストール方法で試してみましたが、インストールはされませんでした。

    CMakeのオプションをいじるものでしょうか。

    アドバイスよろしくお願いします。

    • idojun より:

      はじめまして.環境(windows,linux,mac)は何をお使いでしょうか?windowsだとすると,インストールはインストーラをご利用でしょうか?それとも,ソースからのコンパイルでしょうか?
      また,src/highgui/cvcap*.cppをすべてインストールしたいとのことですが,これらはソースファイルであり,通常はインストール不要だと思われます.目的などをお教えいただければ,アドバイスできるかもしれません.

  26. shimazu より:

    2.2系の API を使っているのですが、バグのように思える問題を見付けました。
    GenericDescriptorMatcher::clear() の後に再度 add() しようとすると異常終了してしまいます。
    リファレンスによると、
    http://opencv.jp/opencv-2svn/cpp/features2d_common_interfaces_of_generic_descriptor_matchers.html#cv-genericdescriptormatcher-clear

    訓練コレクション(画像とキーポイント)をクリアします.

    とあるのですが、ソースを見ると、どうやらキー・ポイントしかクリアしていないようです。
    https://code.ros.org/trac/opencv/browser/trunk/opencv/modules/features2d/src/matchers.cpp#L751

    void GenericDescriptorMatcher::clear()
    {
    trainPointCollection.clear();
    }

    このため、続けて add() しようとすると、画像とキー・ポイントの対応が取れ無くなっている様に思えます。
    本家に報告すべきでしょうか?

    • idojun より:

      今,環境がないので簡単な確認しかできませんが,確かに仰る通りの問題だと思います
      (VectorDescriptorMatcherなどでも同様の問題が起きそうな気がします).

      Matcherを新たに再作成することを除けば,有効な回避策もなさそうなので,バグトラッカーに登録されると良いと思います.

      • shimazu より:

        登録してみます。
        ちなみに、検証コードを作ってみました。

        // std C++
        #include	<stdexcept>
        #include	<vector>
        
        // OCV
        #include	<opencv2/core/core.hpp>
        #include	<opencv2/highgui/highgui.hpp>
        #include	<opencv2/features2d/features2d.hpp>
        
        int main(int argc, char* argv[])
        {
        	if(argc < 2)
        		throw std::domain_error("too few arguments");
        
        	std::vector<cv::Mat> image;
        	for(int i = 1; i < argc; i++)
        		image.push_back(cv::imread(argv[i], 0));
        
        #define		OCTAVE			4
        #define		OCTAVE_LAYER	2
        	cv::Ptr<cv::FeatureDetector> fd(new cv::SurfFeatureDetector(500, OCTAVE, OCTAVE_LAYER));
        	std::vector<std::vector<cv::KeyPoint>> kp;
        	fd->detect(image, kp);
        
        	cv::Ptr<cv::GenericDescriptorMatcher> dm(new cv::VectorDescriptorMatcher(
        		new cv::SurfDescriptorExtractor(OCTAVE, OCTAVE_LAYER),
        		new cv::BruteForceMatcher<cv::L2<float>>));
        	dm->add(image, kp);
        
        #ifndef	HACK_GenericDescriptorMatcher_clear
        	dm->clear();
        #else	//!HACK_GenericDescriptorMatcher_clear
        	dm = new cv::VectorDescriptorMatcher(
        		new cv::SurfDescriptorExtractor(OCTAVE, OCTAVE_LAYER),
        		new cv::BruteForceMatcher<cv::L2<float>>);
        #endif	//!HACK_GenericDescriptorMatcher_clear
        
        	dm->add(image, kp);	//!!
        
        	return 0;
        }
        
  27. IloveOpencv より:

    OpenCVのライセンスはBSDライセンス(相当?)で、OpenCVのhighguiのライブラリはlibavcodecに依存していると思います。動画ファイルを扱うプログラムを作ろうとするとhighguiを使うことになると思いますが、OpenCVのライセンスにしたがうだけでよいのでしょうか?それともOpenCVのライセンス+libavcodecのライセンス(LGPL)の両方にしたがうことになるんでしょうか?
    色々調べましたが、ライセンスの文書が難しくよくわかりません。
    よろしくお願い致します。

    • idojun より:

      個人的な見解ですが,配布時にリンクされるライブラリ全てのライセンスに従っておけば問題ないのではないでしょうか.ソースコードに手を加えず,動的にリンクする場合,両方のライセンスに従うことは可能だと思います.

      • ILoveOpenCV より:

        早速の回答ありがとうございます。
        その場合、LGPLとBSDライセンスは一部矛盾があるとのことですが、自分で書いたコードはどの様なライセンスにしておくのがよいでしょうか?ご意見よろしくお願い致します。

        • idojun より:

          ソースコードに手を加えず,ライブラリを動的にリンクする場合,それらのライセンスに従うのに矛盾は生じないと思うのですが,どのような矛盾があるのかを教えて頂けますでしょうか.
          自分も専門家ではないので,思い違いがあるのかもしれません.

          • ILoveOpenCV より:

            早速の返事ありがとうございます。
            矛盾があると思っていたのは以下のサイトの記述からです。
            よろしくお願い致します。

            http://www.gnu.org/licenses/gpl-faq.ja.html

            該当部分を以下にコピーします。

            どうしてオリジナルのBSDライセンスはGPLと矛盾するのですか?
            オリジナルのBSDライセンスはGPLには無い特定の要件を課すからです。その要件とは、プログラムの宣伝に関するものです。GPLでは:

            You may not impose any further restrictions on the recipients’ exercise
            of the rights granted herein.

            (訳: あなたは受領者に、ここで認められた権利の行使に関して更なる制限を課し
            てはならない。)

            オリジナルBSDの宣伝条項はまさしくそのような「更なる制限」を提供しており、よってGPLと矛盾します。

            改訂BSDライセンスには宣伝条項がありませんから、問題ありません。

          • idojun より:

            リンク先を拝見しました.まず,この記述はGPLについて書かれているようです.GPLとLGPLは,(特に,それをライブラリとして利用する場合)異なります.
            LGPLを動的にリンクした実行ファイルが「派生物」にあたるかどうかは諸説あるようですので断定はできませんが,個人的には
            http://www.opensource.jp/lesser/lgpl.ja.html にあるように,

            『ライブラリ』のいかなる部分の派生物も含まないが、それとコンパイルされ るかリンクされることにより『ライブラリ』と共に動作するようデザインされ ているプログラムは、「『ライブラリ』を利用する著作物」と呼ばれる。その ような著作物は、単体では『ライブラリ』の派生著作物ではないので、この契 約書の範囲外に置かれる。

            という考えです.
            また,ライセンスを読んでいただければわかると思いますが,OpenCVは広告条項が除かれた所謂修正BSDです.現在では旧BSDはあまり利用されないので,BSDといった場合は修正BSDであることが多数だと思います.
            参考になれば幸いです.

  28. tack より:

    二値化された画像から抽出された輪郭の座標データをxmlファイルに書き込む場合、cvOpenFileStorageやcvStartWriteStructを使っています。OpenCVのSAMPLE-CODEにあるものです。しかしこれは書き込む各輪郭の順番を作業者が選べません。
    そこでわたしは複数の輪郭を一つ一つマウスで選択し、選択した順番どおりに輪郭の座標点を書き込む方法を探しています。
    流れは、 選択→Enterキー→書き込み→選択→Enterキー→選択→Enterキー…といった感じです。
    現状は、選択した輪郭を書き込むことはできますが、毎回データを追加したいのですがそれができず毎回上書きしてしまい、結局ファイル内には一つの輪郭の座標データしか残りません。

    ファイルを読み込んでも上書きせず追加するような関数はないでしょうか。または参考となるURLがありましたら教えてください。今大変困っています。アドバイスお願いします。

    • idojun より:

      私が状況をよく理解していないかもしれませんが,「途中でファイルストレージを閉じず(cvReleaseFileStorage)に,最後までデータを書いてから閉じる」,という方法では,何か不都合がありますでしょうか.
      そのような方法が使えない場合,輪郭を指定した順番通りに,別の構造体に保存して,最後にまとめて書き込む,という方法になるかと思います.

  29. ykuri より:

    静止画キャプチャの解像度の変更について質問があります.

    現在,

    opencv1.0.0
    Linux Debian 2.6.26-2-686

    を使用しています。

    opencv1.0.0では,CvCaptureSetPropertyの解像度の変更が未実装だということがわかりました.

    しかし,ウインドウズでは以下のurlのように
    http://tech.groups.yahoo.com/group/OpenCV/message/56022
    cap.cppが存在して,書き換えれば対応するみたいですが,Linux版にも同じようなファイルが存在するのでしょうか?

    もしないようでしたら,opencv2.xに変更しようと考えています.
    その場合,cap_vfw.cppは確認できたのですが,Linuxではどのファイルにあたるのでしょうか?

    素人で申し訳ありませんが,本当に困っています・・・.

    どうかアドバイスよろしくお願いします.

    • idojun より:

      opencv-1.0.0 において,Windows版の cap_vfw.cpp に対応するファイルは cap_v4l.cpp です.
      これを書き換えたことによって所望の動作になるかどうかは確認していませんが,一応参考までに.

  30. 野々村謙二 より:

    輪郭の凹状の欠損についてアドバイス有難う御座いました。解決しました。

  31. 野々村謙二 より:

    輪郭の凹状の欠損について質問します。
    ①画像を2値化のあと、
    ②輪郭の検出       cvFindContours()を行い、
    ③輪郭の凸包を計算して  hull = cvConvexHull2( )、
    ④輪郭が凸かどうかチェックしてcvCheckContourConvexity( contours )、
    ⑤凹状欠損を計算する
            result = (CvSeq *)cvConvexityDefects(contours,hull,storage2); 
    ⑥result->totalの要素数分を直接アクセスする 
      CvPoint* p = (CvPoint*)cvGetSeqElem(result,i);
    ⑦次にp->x,p->yの値をprint文にて表示する
      printf(“(%d,%d)\n”, p->x,p->y); 

      p->x, p->yの値は 上の③凸のx,y値とは全く違う値になりました。

    要素のp->x,p->yは何か違う値を参照するのでしょうか?

    マニュアルには
    cvConvexityDefect()はCvConvexityDefect構造体のシーケンスを返すとありますので、CvConvexityDefect構造体の値を参照したいのですが、

    下のようにプログラムを書くと
    CvConvexityDefect *defect=0;
    defest = (CvSeq *)cvConvexityDefects(contours,hull,storage2);
    ビルドの時に
    ‘CvSeq *’ から ‘CvConvexityDefect *’ に変換できません。となってしまいます。
    なぜでしょうか?
    アドバイスをお願いします。

    • idojun より:

      おっしゃるように,cvConvexityDefects が返すのは,CvPoint ではなく CvConvexityDefect のシーケンスです.
      ですので,例えば,次のようになります.

        CvSeq *convexhull, *defects;
        if(! cvCheckContourConvexity(contours)) {
          convexhull = cvConvexHull2(contours, storage, 0, 0);
          defects = cvConvexityDefects(contours, convexhull, storage);
        }
      
        for(i=0; i<defects->total; i++) {
          // CvConvexityDefect *p = (CvConvexityDefect*)cvGetSeqElem(defects, i);
          CvConvexityDefect *p = CV_GET_SEQ_ELEM(CvConvexityDefect, defects, i);
          printf("(%d,%d)->(%d,%d)\n", p->start->x, p->start->y, p->end->x, p->end->y);
        }
      

      CvSeq* と CvConvexityDefect* は,全く異なる構造体を指すポインタなのでキャストすることはできません.CvSeq というシーケンスの要素が CvConvexityDefect であって,CvSeq が CvConvexityDefect の配列,というわけでありません.
      このような場合,上記のように,cvGetSeqElemではなくCV_GET_SEQ_ELEMマクロを利用すると,キャストの前に,defects->elem_size が sizeof(CvPoint) と一致しないエラーがでるので間違いに気づきやすいと思われます.

  32. koeda より:

    サーバメンテナンスのため,1時間程度,断続的にアクセスが行えなくなりますのでご注意下さい.
    ・作業日時:2010年8月9日(月) 2:00~6:00

  33. hogelog より:

    リファレンスマニュアルのページ下部に表示されているメッセージの
    「このドキュメントに誤りなどを見つけたらbug report まで報告してください.」
    のbug reportのリンクが古い
    http://sourceforge.net/tracker/?func=add&group_id=22870&atid=376677
    になっています。一応機能しているようですが、現在はメインの
    https://code.ros.org/trac/opencv/wiki
    に修正しておくべきではないでしょうか。

    • idojun より:

      OpenCV-2.1のドキュメントのbug report先も全て修正しておきました.ご報告ありがとうございます.

  34. idojun より:

    OpenCV.jpに対するご指摘や要望などをお願いします.

  35. idojun より:

    投稿は,このように表示されます.
    また,[cpp] … [/cpp] タグや, [python] … [/python] タグでコードを囲むと,以下のように表示することが出来ます(ここでは説明のために,全角ブラッケット”[”, “]”を利用していますが,実際には半角ブラケット “[", "]” を利用します).

    #include "cv.h"
    int main(int argc, char *argv[])
    {
      return 0;
    }
    

コメントをどうぞ