2011-07-21 9 views
3

OpenCV 2.3を使用して簡単なウェブカメラプログラムを作成していて、コンパイルエラーが発生しました。任意のアイデアが評価されます。webcamからキャプチャした画像を保存できません(OpenCV 2.3でのimwriteコンパイルエラー)

コンパイル時に、imwrite(以下のコードのread関数内)で次のエラーが発生します。

This sampleイメージを保存するためにimwriteを使用する環境は、自分の環境で動作します。これは、OpenCV 2.3のimwriteが自分のenvで動作するはずであることを示します。

エラー:

error: invalid initialization of reference of type ‘const cv::_InputArray&’ from expression of type ‘cv::Mat*’ 
/usr/local/include/opencv2/highgui/highgui.hpp:110: error: in passing argument 2 of ‘bool cv::imwrite(const std::string&, const cv::_InputArray&, const std::vector<int, std::allocator<int> >&)’ 

コードの抜粋:

#include <iostream> 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/core/core.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 

using namespace std; 
using namespace cv; 

//IplImage* SampleClassA::dispImg = NULL; 
Mat* SampleClassA::dispImg = NULL; 

int read() 
{ 
     Mat* sharedImg; 
    sharedImg = getFrame(); 
    if (sharedImg) 
    { 
     if (dispImg == NULL) 
     { 
      SampleClassA::dispImg = sharedImg; 
     } 
     Mat outMat; 
     outMat = imwrite("./out/sample.jpg", sharedImg); 
    } 
    sleep(100); 
    return 1; 
} 

Mat* getFrame() 
//IplImage* ReadRealTime::getFrame() 
{ 
    if (!capture.isOpened()) // Actual capturing part is omitted here. 
    { 
     return NULL; 
    } 
    Mat frame; 
    capture >> frame; 
    return &frame; 
} 
</code> 

ところで、私は関数imwriteは、私のマシン上で2つの引数または3次のリンクとhighgui.hppどちらを取るかどうか混乱しているが、3を言いますargsですが、上で引用したサンプルコード(from ros.org)は2つしか使用しません(これは同じことをするためです)。 http://opencv.itseez.com/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=imwrite#imwrite

ps。私が[email protected]に送ったものと同じ質問をここに投稿することを許してください。私がこれをした理由は、このウェブサイトがよりインタラクティブで多様な目的のために便利だと思われるからです。

答えて

2

3番目のパラメータはオプションです(フォーマットに依存するパラメータの配列)。 'sharedImage'はタイプがMat *で、imwriteの予期されるタイプである 'const cv :: _ InputArray &'に自動的にキャストできないため、エラーが発生しています。この例をもっと慎重に見ると、2番目に渡されたパラメータの型は実際にはMat(Mat *ではない)であることがわかります。 これが役立つことを願っています。

+0

ありがとう@crisbia。あなたのコメントを見て、私はimwriteの2番目の引数にsharedImg(* sharedImgを作る)の前に '*'を追加してコンパイルエラーを回避しました。私が当初予想していた通りに動作するかどうかは分かりません(私はまだまだ指摘していますが)。 – IsaacS

+0

喜んで助けてください。あなたのプロジェクトで幸運を祈ってください:) – crisbia

+1

@ user577:あなたはそこでポインタを使うべきではありません。 Matは参照カウントのデータ型です。コードが壊れている場合は、ローカル変数へのポインタを返しています(http://en.wikipedia.org/wiki/Dangling_pointerを参照)。 – etarion