opencv - 在尝试复制 Bit16 Mat 时,实际上只有一半被复制

标签 opencv casting mat

所以我是 OpenCV 的新手,我想做的是复制 bit16 矩阵的元素。

src.create(h, w, CV_16UC(channels));
dst.create(hr, wr, CV_16UC(channels));
finalDst.create(h, w, CV_16UC(channels));
memcpy(src.data, data_in, w*h*sizeof(raw_t_ubit16));
for (i = 0; i < h; i++)
{
  for (j = 0; j < w; j++)
  {
    finalDst.data[j + i*w] = src.data[j + i*w];
  }
}
memcpy(data_out, finalDst.data, h*w*sizeof(raw_t_ubit16));

然而,这只会复制图像的一半,具有讽刺意味的是,如果我将 2*h 而不是 h,那么一切都会恢复正常。但事实并非如此,因为我将 h 定义为图像的确切高度,就像 w 是宽度一样。

最佳答案

src.data - 为您提供 (*uchar),但不提供 (*raw_t_ubit16)。

(*uchar) 8 位。

(*raw_t_ubit16) 16 位。

((*uchar)data)[2] - 将指向数组中的第 3 个字节(假设为 uchar 数组)。

((*raw_t_ubit16)data)[2] - 将指向数组中的第 5 个字节(假设数组为 raw_t_ubit16)。

这就是为什么你只复制了一半。

你可以这样写:

((raw_t_ubit16*)finalDst.data)[j + i*w] = ((raw_t_ubit16*)src.data)[j + i*w];

它应该可以工作,但最好使用 Mat 类的 clone() 方法:

m1=m2.clone();

关于opencv - 在尝试复制 Bit16 Mat 时,实际上只有一半被复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31483160/

相关文章:

sql - Bigquery - 整数到时间戳

java - ArrayList<Object> 中的不兼容类型错误

c++ - 如何在 opencv 中屏蔽 float 垫

opencv - 如何在C++ OpenCV代码中将PyObject变量转换为Mat

java - 用于比较两个 Mat 时 countNonZero 出错

python - 如何将 OpenCV 图像与颜色进行比较

c++ - 执行 'cv::flip(img, img, 1)' 的替代方法

c# - 删除 DateTime.UctNow.TimeOfDay 的毫秒部分的最简单方法是什么?

python - 如何在Tkinter界面中显示来自OpenCV的图像?

python - 使用图像作为卷积核