2

開発したコードのプロファイリングを行っていますが、cvSet2Dを使用するとコードにボトルネックがあります。より効率的なcvSet2Dに代わるものはありますか?

どうすればそのピクセルを書くことができますか?

4

2 に答える 2

1

古いCスタイルの関数ではなく、C++関数を使用することをお勧めします。

ピクセルに書き込む最も効率的な方法は次のとおりです。

   cv::Mat frame;

   // load your img to your Mat

   uchar* p = frame.ptr(row); // returns a row pointer
   p[column] = x; // accesses value in the given column

注意すべき点の1つは、ピクセル列よりも多くの列がある可能性があることです。たとえば、3チャネルの画像では、アクセスできる実際のピクセル列の数が3倍になります。

ピクセルを反復処理するさまざまな方法の詳細については、このチュートリアルを確認してください。

于 2012-04-25T08:45:05.840 に答える
0

構造体のデータフィールドへのポインタを取得する必要があります。

(C API)IplImage構造には、dataと呼ばれるchar*フィールドがあります。最初の要素にアクセス(your_type*)image->dataし、通常のC 1D配列のように使用しますが、フィールドstepWidthを使用して行から次の行にジャンプするように注意してください(メモリアクセスの最適化のためにデータの行が16ビットの倍数に整列される場合があるため) )。

(C ++ API)T* cv::Mat::ptr<T>(int i)アクセスする行の最初の要素へのポインターを取得するために使用します。次に、通常のC++1D配列として使用します。

これはより高速なアクセスパターンである必要があります(さまざまなアクセスパターンの比較については、OpenCV2クックブックを参照してください)。

于 2012-04-25T08:46:33.233 に答える