在 OpenCV 中将 Mat 转换为数组/向量
在 OpenCV 中,访问和操作图像数据对于各种图像处理任务至关重要。一个常见的需求是将代表图像或矩阵的 Mat 对象转换为数组或向量。
转换为数组
如果 Mat 对象的内存是连续的,意味着它的所有数据都是连续存储的,可以使用以下代码直接获取一维数组:
<code class="cpp">std::vector<uchar> array(mat.rows * mat.cols * mat.channels()); if (mat.isContinuous()) array = mat.data;</code>
其中mat是Mat对象,array是转换后的数组,.rows,.cols , 和 .channels() 表示图像尺寸和通道数,.data 是指向图像数据的指针。
转换为向量
对于非连续的 Mats,需要逐行检索数据。下面是转换为 2D 数组/向量的示例:
<code class="cpp">uchar **array = new uchar*[mat.rows]; for (int i = 0; i < mat.rows; ++i) array[i] = new uchar[mat.cols * mat.channels()]; for (int i = 0; i < mat.rows; ++i) array[i] = mat.ptr<uchar>(i);</code>
但是,使用 std::vector 可以简化转换:
<code class="cpp">std::vector<uchar> array; if (mat.isContinuous()) { array.assign(mat.data, mat.data + mat.total() * mat.channels()); } else { for (int i = 0; i < mat.rows; ++i) { array.insert(array.end(), mat.ptr<uchar>(i), mat.ptr<uchar>(i) + mat.cols * mat.channels()); } }</code>
Mat 数据连续性
了解 Mat 数据连续性对于高效转换至关重要。以下是一些关键点:
例如,在以下代码片段中:
<code class="cpp">cv::Mat image = cv::imread("image.jpg"); // continuous Mat cv::Mat sub_image = image(cv::Rect(100, 100, 100, 100)); // non-continuous Mat since it borrows data from `image`</code>
图像是连续的Mat 因为它是使用 imread() 创建的,而 sub_image 是不连续的,因为它引用了图像 Mat 的一部分。
以上是如何有效地将 OpenCV Mat 对象转换为 C 数组或向量?的详细内容。更多信息请关注PHP中文网其他相关文章!