0

OpenCVでビデオフレームを読み取ってから、データを別のC ++コードにコピーして、別のことを実行しようとしています。私のコードは次のとおりです。

cv::Mat capturedFrame; 
int newData[600][800];
std::cout<<"Debug1 " << std::endl;
memcpy((char*)newData, (char*)capturedFrame.data, 600*800*sizeof(int) );
std::cout<<"Debug2 " << std::endl;
mycode.setData ( newData );
std::cout<<"Debug3 " << std::endl;

次に、クラス「setData」は次のように定義されました。

char data [600][800];
void mycode::setData ( char newData[600][800] )
{
  for ( int m=0; m < 600; m ++ )
  {
      for ( int n = 0; n < 800; n ++ )
      {
          data[i][j] = newData[i][j]; 
      }
  }
}

しかし、次の行になるとコードは停止します。

    mycode.setData ( newData );

私を混乱させるのは、このコードを削除すると、画面に「Debug1」から「Debug3」が表示されることです。これは正常です。しかし、このコードを使用すると、画面に「Debug1」と「Debug2」を出力しなくてもプログラムが停止します。これは本当に奇妙です。また、「setData」クラスのすべての行をコメント化して空のクラスにしようとしましたが、エラーは同じです。ですから、それは「setData」クラスに関するものではなかったと思います。また、「capturedFrame.data」に他のフィルターを実行したため、「capturedFrame.data」が正しいこともわかっています。結果は良好でした。誰かがここでエラーを説明できますか?

編集:

デバッガーを使用しましたが、エラーメッセージは表示されませんでしたが、プログラムが応答を停止しました。また、データ型を「char」に変更しました。

4

2 に答える 2

4

この配列:

int newData[600][800];

1MBを超えています。これがローカル変数である場合は、スタックを爆破している可能性があります。

配列についても同じことdataが言えますが、コードスニペットにはコンテキストがほとんどないため、静的に割り当てられるものと自動的に割り当てられるものを判断するのは困難です。

これらの大きな配列を動的に割り当てることを検討する必要があると思います。

于 2012-09-28T07:57:17.500 に答える
1

コメントアウトした場合

mycode.setData ( newData );

compile-optimizerは、newDataが使用されていないことを認識している可能性があるため、

memcpy((int*)newData, (int*)capturedFrame.data, 600*800*sizeof(int) );

実行されていない可能性があるため、削除される可能性もあります。

memcpyメソッド、または他の場所に問題が存在する可能性があります。

あなたが提供した限られた情報に基づいて、本当の理由を調査するのは難しいですが、私はあなたが他のコードをより深く調べることができることを提案します。

于 2012-09-28T07:55:37.297 に答える