開発したコードのプロファイリングを行っていますが、cvSet2Dを使用するとコードにボトルネックがあります。より効率的なcvSet2Dに代わるものはありますか?
どうすればそのピクセルを書くことができますか?
古い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倍になります。
ピクセルを反復処理するさまざまな方法の詳細については、このチュートリアルを確認してください。
構造体のデータフィールドへのポインタを取得する必要があります。
(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クックブックを参照してください)。