2010-12-17 79 views
3

このコードは現在まで使用されていました。何が原因でエラーが発生しているのかわかりません(実際にコードを変更したことは覚えていません)。C++ + OpenCV =アクセス違反の読み取り場所0x02176000

IplImage* fIplImageHeader = cvLoadImage(filePath.c_str()); 

    vector<int> p; 
    p.push_back(CV_IMWRITE_JPEG_QUALITY); 
    p.push_back(75); // JPG quality 
    vector<unsigned char> buf; 
    cv::imencode(".jpg", fIplImageHeader, buf, p); // this line gives error 

完全なエラーがある:ここでは(それはOpenCVのIplImageへのオブジェクトへのファイルから画像を読み取り、JPEGバッファに変換)である

Unhandled exception at 0x638fee22 in Client.exe: 0xC0000005: Access violation reading location 0x02176000. 

fIplImageHeaderに有効な画像が含まれています私が使用して確認することができます。

cvShowImage("Window", fIplImageHeader); 

EDIT:

長いスニペット:

while (l < 30) 
{ 
      // path to image 
    std::stringstream sstm; 
    string filePath; 
    sstm << workingDirectory << "/temp/" << k << ".jpg"; 
    filePath = sstm.str(); 

    cout << filePath.c_str() << endl; 

    // load image to IplImage 
    IplImage* fIplImageHeader = cvLoadImage(filePath.c_str()); 

    // convert to JPG 
    vector<int> p; 
    p.push_back(CV_IMWRITE_JPEG_QUALITY); 
    p.push_back(75); // JPG quality 
    vector<unsigned char> buf; 
    cv::imencode(".jpg", fIplImageHeader, buf, p); 

      // do stuff 

    k++; 
    l++; 
    if (10 == k) 
    { 
     k = 0; 
    } 

    char key = cvWaitKey(1000/30); 

    cvReleaseImage(&fIplImageHeader); 
} 
+0

'imencode 'のドキュメントは、そのパラメータについて何を言いますか? –

+0

@Martin York http://opencv.willowgarage.com/documentation/cpp/reading_and_writing_images_and_video.html –

+0

なぜC++とCのインターフェイスを混在させていますか? (IplImageとcv :: matを使ったcv :: imencode) – etarion

答えて

2

出力バッファは、出力画像にリサイズされるようになっているが、あなたはbufオブジェクトに明示的なサイズを指定していません。少なくともこれはあなたの参照先のドキュメントページから参照されますhttp://opencv.willowgarage.com/documentation/cpp/reading_and_writing_images_and_video.html

bufに明示的なサイズを設定できますか?今すぐあなたのコードサンプルでは、​​それはちょうど空のベクトルです。

編集:はい、私はあなたが正しいと思います。もし私が文書ページでもう少し見ていたら、それはcv::imencodeが割り当てを行うことを示しているようですので、そうする必要はありません。そうだとしたら、あなたの入力イメージは本当に大きいですか?メモリが不足していますか?また、cv::imencodeのデバッグバージョンに入ることができますか?

EDIT:別のコードサンプルはhttp://opencv.willowgarage.com/documentation/cpp/core_basic_structures.html#Mat

IplImage* img = cvLoadImage("greatwave.jpg", 1); 
Mat mtx(img); // convert IplImage* -> cv::Mat 

このページであります、あなたはまた、「CVに変換::マットを」ステップを試してみてください、とcv::imencodeにそれを渡すことはできますか?

+0

ベクトルは自動的にサイズ変更されると思いますか?しかし私は手動でサイズを設定しようとします。ありがとう。 –

+0

画像は31KBのJPEG画像です。 IplImageにロードすると、もちろんそれは大きくなります。しかしそれはまだかなり小さいはずです(おそらく数百KB)。 –

+0

私はマットの変換も試みました。同じ例外がスローされます。私は私の質問にもっと長いコードスニペットを追加しました。私は実際にはwhileループでこれをやろうとしていますが、最初のサイクルでは例外が発生して問題にならないはずです。 –

2

EDIT:私の悪い、私はだから私は間違って起こっているかわからない...そのメソッドを使用していませんでした...

私は「imencode」を使用して、同じ例外を持っていた、私は知りません私は、私は本当に* UCHARするベクターから変換する必要がある場合、私は知らない

void CWebcamWidget::putJpegImage(IplImage *iplImage) { 
    // Sans compression jpeg 
    //image = QImage((const uchar*)iplImage->imageData, iplImage->width, iplImage->height, QImage::Format_RGB888).rgbSwapped(); 

    // Still doesn't work using cv::vector... 
    cv::vector<int> p; 
    p.push_back(CV_IMWRITE_JPEG_QUALITY); 
    p.push_back(75); // JPG quality 
    cv::vector<uchar> jpegBuf; 
    imencode(".jpg", iplImage, jpegBuf, p); 

    // Conversion vector<uchar> => uchar* 
    uchar *buf; 
    memcpy(buf, &jpegBuf[0], sizeof(uchar)*jpegBuf.size()); 

    image = QImage((const uchar*)buf, iplImage->width, iplImage->height, QImage::Format_RGB888).rgbSwapped(); 
    imageLabel->setPixmap(QPixmap::fromImage(image)); 
} 

jpegBufベクトルにサイズを変更する必要がある場合は、多分私も

0

私は...それなしに、いくつかのCPU時間を節約することができます最近OpenCV 3.0をVisual Studio 2015と組み合わせて使用​​するプロジェクトのデバッグビルドでこの問題が発生しました。このプロジェクトは以前はVisual Studio 2013でビルドされていましたが、この問題は覚えていません。リリースビルドでも例外は発生しませんでした。私は公式OpenCVのウェブサイトからダウンロードopenvc_world300.dllとの.libを使用

bool writeImageToDisk(const std::string& filename, cv::Mat image) { 
    std::vector<uchar> imageData; 
    bool result = cv::imencode(".jpg", image, imageData); 
    if (!result) { 
     return false; 
    } 
    ... 

:例外は、私はこのような使用imencodeの呼び出し中に発生しました。彼らはサブフォルダvc12に置かれていたので、私はそれらがVisual Studio 2013でビルドされていると仮定します。適切なVisual C++ 2013 DLLが自分のシステムにインストールされていないため、デバッグバージョンをテストできませんでした。

OpenCV 3にアップグレードした後。2この問題は何かに触れずに私のために修正されたので、おそらくバグや分散バイナリに問題がありました。

関連する問題