2016-09-09 23 views
0

イメージパスのベクトルを反復処理して、cv :: imread関数で読み込み、結果のcv :: Matにformat_signal関数を使用しています。 。OpenCV - ベクトルを反復処理するときに "無効なパラメータ"

#include "tp1.hpp" 

using ImagePathFlag = std::pair<std::string, int>; 

int main(int /*argc*/, char** /*argv*/) { 
    try { 
     const std::vector<ImagePathFlag> vsTestImages = { 
      { "data/test1.png",cv::IMREAD_GRAYSCALE }, 
      { "data/test2.png",cv::IMREAD_GRAYSCALE }, 
      { "data/test3.png",cv::IMREAD_GRAYSCALE }, 
      { "data/test4.png",cv::IMREAD_COLOR }, 
      { "data/test5.png",cv::IMREAD_COLOR }, 
      { "data/test6.png",cv::IMREAD_COLOR }, 
      { "data/test7.png",cv::IMREAD_COLOR }, 
      { "data/test8.jpg",cv::IMREAD_COLOR }, 
      { "data/test9.bmp",cv::IMREAD_COLOR }, 
      { "data/test10.bmp",cv::IMREAD_COLOR }, 
     }; 
     for (const ImagePathFlag& oImagePathFlag : vsTestImages) { 
      std::cout << oImagePathFlag.first << std::endl; 
      cv::Mat oInputImg = cv::imread(oImagePathFlag.first, oImagePathFlag.second); 
      if (oInputImg.empty()) 
       CV_Error_(-1, ("Could not load image at '%s', check local paths", oImagePathFlag.first.c_str())); 

      std::vector<uint8_t> signal = format_signal(oInputImg); 


     } 
    } 
    catch (const cv::Exception& e) { 
     std::cerr << "Caught cv::Exceptions: " << e.what() << std::endl; 
    } 
    catch (const std::runtime_error& e) { 
     std::cerr << "Caught std::runtime_error: " << e.what() << std::endl; 
    } 
    catch (...) { 
     std::cerr << "Caught unhandled exception." << std::endl; 
    } 
    return 0; 
} 

format_signalとlz77_encode細かいループの最初の反復または動作しているようですが、この最初の反復の終わりに、次のエラーでプログラムの開発がクラッシュ:

Unhandled exception at 0x00007FFE6E5D4388 (ucrtbase.dll) in inf4710_tp1.exe: An invalid parameter was passed to a function that considers invalid parameters fatal.

かなりわかりませんここで何が起こっているのですか?私は、forループの構文が私の先生によって提供されたのと同じように完全に理解していないことを認めています。

助けが必要ですか?

EDIT

inline std::vector<uint8_t> format_signal(const cv::Mat& oInputImage) { 
    CV_Assert(!oInputImage.empty() && oInputImage.isContinuous() && (oInputImage.type() == CV_8UC1 || oInputImage.type() == CV_8UC3)); 

    std::vector<uint8_t> vSignal; 
    cv::imencode(".png", oInputImage, vSignal); 
    return vSignal; 
} 
+0

トピックを表示:教師から最新のC++コードを入手しましたか?クロム!未来への希望がある! – user4581301

+0

問題は確かに 'lz77_encode'にあります。バッファオーバーラン、または他の形式のスタック破損のいずれかが発生します。ソースを見ずに言うのは難しい。 – user58697

+0

メインでlz77_encodeを呼び出さなくても問題は解決しません。これを示すために私のコードを編集しました。 –

答えて

0

I admit that I don't fully understand the syntax of the for loop

使用している範囲に基づくC++ 11以降で利用できるforループ。ペアのベクトルの各アイテムを繰り返し処理します。 問題をデバッグしましたか?もしそうなら、今まで見たことを分かち合うことができますか?あなたのformat_signalは何をしますか?その機能ですべて正常に機能しますか?

+0

私はformat_signalを投稿します。 –

+0

1.アプリケーションをデバッグシンボルで構築していますか?もしそうなら、gdb/lldb /その他のデバッガを使ってアプリケーションを実行し、スタックトレースを調べることができますか?チェックするもう1つの方法は、format_signalへの呼び出しをコメントアウトして、その関数がエラーの原因であるかどうかを確認することです。私はOpenCV 3.0を利用できないので、問題を再現することはできません。私は大好きですが、セットアップを変更することはできません。 –