6

openCVでビデオフレームを読み、cv::Mat形式でデータを保存しようとしています。次に、このビデオフレームに「int型マトリックス」を受け入れる別のコードを使用したいと思います。「cvMat」と「int型行列」には互換性がないことを知っています。opencvに慣れていないかもしれませんが、キャプチャしたビデオフレームにコードを使用できるように、「cvMat」と「intmat」の間で任意の変換を行うことはできますか?私は「intmat」と言います、多分それは正しくありません、しかし私が意味するのはこれです:

cv::Mat videoFrame;
int inputData[600][400];

私は次のようなことをしたい:

inputData = videoFrame;

ありがとうございました。

4

1 に答える 1

6

手っ取り早い方法は、メモリを共有することです。コピーは必要ありません。ただし、一方のマトリックスを変更すると、もう一方のマトリックスも変更されます(明らかです!)

int inputData[600][400];
cv::Mat videoFrame(600, 400, CV_32UC1, inputData);

タイプ/サイズを変更するvideoFrameでのOpenCV呼び出しは、結果が保存される新しいメモリを割り当てることに注意してください。

個別のデータマトリックスが必要な場合は、memcpyを使用できます。これはデータを複製するための最速の方法です。

memcpy((char*)inputData, (char*)videoFrame.data, 600*400*sizeof(int) );

このアプローチの問題は、それがまったく安全ではないということです。videoFrameがint型でない場合はどうなりますか?(おそらくそれはcharです)。それがメモリに継続的に保存されていない場合はどうなりますか(発生する可能性があります)?..。

于 2012-09-26T13:39:02.600 に答える