OpenCV矩阵和int矩阵之间的转换

E_l*_*ner 6 c++ video opencv matrix type-conversion

我试图用openCV读取视频帧,以cv :: Mat形式保存数据.然后我想使用另一个接受"int type matrix"的代码到这个视频帧.我知道"cvMat"和"int类型矩阵"不兼容.也许我不熟悉opencv,但是我可以在"cvMat"和"int mat"之间进行任何类型的转换,以便我可以将我的代码用于捕获的视频帧吗?我说"int mat",也许它不正确,但我的意思是:

cv::Mat videoFrame;
int inputData[600][400];
Run Code Online (Sandbox Code Playgroud)

我想做的事情如下:

inputData = videoFrame;
Run Code Online (Sandbox Code Playgroud)

谢谢.

Sam*_*Sam 6

快速的方法是共享内存:无需复制.但是,如果你修改一个矩阵,另一个将被修改(显而易见!)

int inputData[600][400];
cv::Mat videoFrame(600, 400, CV_32UC1, inputData);
Run Code Online (Sandbox Code Playgroud)

请注意,对于更改其类型/大小的videoFrame上的任何进一步OpenCV调用将分配一个新的内存块,其中将存储结果.

如果你想拥有单独的数据矩阵,你可以使用memcpy -it来复制数据的最快方法:

memcpy((char*)inputData, (char*)videoFrame.data, 600*400*sizeof(int) );
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于它根本不安全.如果videoFrame不是int类型怎么办?(很可能是char).如果没有连续存储在内存中(可能会发生)怎么办?...

  • 当直接使用`cv :: Mat`的底层数据时,请注意OpenCV可能引入的任何填充,特别是在将其传递给其他期望有连续数据的函数时.OpenCV可以(并且默认情况下)将在行之间引入额外的填充以将它们对齐到4(或8)字节边界.虽然对于32位整数(和/或这样的圆形行宽),可能不会有任何填充,但通常需要记住这一点. (3认同)