要将 cv::Mat
的像素矩阵拷贝到 uchar* img
,你可以使用 cv::Mat::data
指针来访问 cv::Mat
中的像素数据,然后使用 memcpy
或者直接进行指针操作将数据拷贝到目标数组。以下是一些示例代码,说明如何实现这一点:
示例代码
#include <opencv2/opencv.hpp>
#include <cstring> // for memcpy
void copyMatToUcharPtr(const cv::Mat& mat, uchar* img) {
// 确保 mat 是连续的 (也就是说,没有在内存中有行间隔)
if (!mat.isContinuous()) {
std::cerr << "Matrix is not continuous!" << std::endl;
return;
}
// 拷贝数据
std::memcpy(img, mat.data, mat.total() * mat.elemSize());
}
int main() {
// 创建一个示例 cv::Mat
cv::Mat originalImage = cv::imread("path_to_image.jpg", cv::IMREAD_COLOR);
if (originalImage.empty()) {
std::cerr << "Could not open or find the image!" << std::endl;
return -1;
}
// 创建 uchar* 数组以存储图像数据
size_t totalPixels = originalImage.total() * originalImage.elemSize();
uchar* img = new uchar[totalPixels];
// 拷贝 Mat 数据到 uchar*
copyMatToUcharPtr(originalImage, img);
// 记得在不需要时释放内存
delete[] img;
return 0;
}
代码解释
检查连续性: 在复制之前,我们确保
cv::Mat
对象是连续的。非连续的矩阵可能会包含行间隔,这会导致简单复制错误。使用
std::memcpy
: 我们使用std::memcpy
来高效地复制数据。我们传入mat.data
和所需字节数(通过mat.total()
和mat.elemSize()
得出)。分配内存: 为了存放图像数据,我们创建了一个动态数组。请务必在不再需要时释放该内存,以避免内存泄漏。
读取图像: 使用 OpenCV 的
cv::imread()
函数从文件加载图像,并进行处理。
这样,你就能够将 OpenCV 的图像矩阵有效地拷贝到一个原始的字符指针中。
内容由零声教学AI助手提供,问题来源于学员提问