cv::Mat::step详解及clone内存对齐

声明:1和2是转载。3以后是原创。

1.简介

step的几个类别区分:

  • step:矩阵每一行元素的字节数,bytesPerLine,一定是4的整数倍
  • step[0]:矩阵每一行元素的字节数
  • step[1]:矩阵每一个元素的字节数
  • step1(0):矩阵中一行有几个通道数
  • step1(1):一个元素有几个通道数(channel())

 2.实践

Mat img(3, 4, CV_16UC4, Scalar_<uchar>(1, 2, 3, 4));
cout << img << endl;
cout << "step:" << img.step << endl;
cout << "step[0]:" << img.step[0] << endl;
cout << "step[1]:" << img.step[1] << endl;
cout << "step1(0):" << img.step1(0) << endl;
cout << "step1(1):" << img.step1(1) << endl;

分析:
创建了一个的16位4通道的矩阵,每一个元素赋值为1,2,3,4.可以看到生成了的矩阵.因为创建的是16位的,所以每一个通道是2个字节数.
所以一行共有个字节数,故step和step[0]都为32
因为一个元素有4个通道,每个通道2个字节,所以1个元素的字节数,step[1]为
一行是4个元素,每个元素是4个通道,所以一行的通道数,step1(0)为,step1(1)为4


————————————————
版权声明:本文为CSDN博主「0penuel0」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/pj18862486309/article/details/108506122

3.clone()可以实现内存对齐

加上.clone();就不会抛异常了。GpuMat的step就一样了。复制了一下,相当于数据的内存位置对齐了。

cuda::divide/cuda::subtract/cuda::add等等运算,image1和image2仅仅宽和高相同也不行,它们的step必须相同。

4.cv::Mat转换为QImage

注意,使用opencv Mat的buf给QImage赋值时,务必带入参数mat.step;因为step是计算生成的每一行元素的字节数,它是4字节对齐的;
否则如果输入图片的分辨率宽度不是4的整数倍,那么QImage会出现显示错乱的问题.

详情见我的另一篇博文:

QImage/cv::Mat/HObject的图像格式互相转换,4字节对齐_qimage转hobject_利白的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/libaineu2004/article/details/132068672