【问题标题】:Understanding the copy done by memcpy()了解 memcpy() 完成的复制
【发布时间】:2015-10-18 20:02:19
【问题描述】:

我必须创建一个列数是原始图像两倍的图像。因此,我将新图像的宽度保持为原始图像的两倍。

虽然这是一个非常简单的任务,而且我已经完成了,但是 我想知道使用 memcpy() 执行此任务所获得的奇怪结果

我的代码:

int main()
{

    Mat image = imread("pikachu.png", 1);
    int columns = image.cols;
    int rows = image.rows;

    Mat twoTimesImage(image.rows, 2 * image.cols, CV_8UC3, Scalar(0));

    unsigned char *pSingleImg = image.data;
    unsigned char *ptwoTimes = twoTimesImage.data;

    size_t memsize = 3 * image.rows*image.cols;

    memcpy(ptwoTimes , pSingleImg, memsize);
    memcpy(ptwoTimes + memsize, pSingleImg, memsize);

    cv::imshow("two_times_image.jpg", twoTimesImage);

    return 0;
}

原图:

结果

预期结果:

问题:当生成的图像只是原始图像的两倍时,为什么 4 个原始图像会被复制到新图像?其次,memcpy() 以逐行方式复制连续的内存位置,因此,据此我应该得到一个显示在“预期结果”中的图像。

【问题讨论】:

  • size_t memsize = 3 * image.rows*image.cols; 这一行是什么?具体来说,3?
  • @SouravGhosh 我怀疑 R、G、B 分量每像素 3 个字节。
  • @TheParamagneticCroissant 在这种情况下,不像twoTimesImage 缺少image.rows 的乘数2。不过,纯属猜测。
  • 它是彩色图像,因此包含 R、G 和 B 通道。因此,每个像素包含 3 个字节。
  • @SouravGhosh 这很有可能。

标签: opencv c++11 memcpy


【解决方案1】:

左猫由奇数行组成,右猫由原始图片的偶数行组成。然后将其翻倍,因此下面还有两只猫。新猫的行数是原猫的一半。

新图片的布局是这样的:

line 1  line 2
line 3  line 4
line 5  line 6
...     
line n-1 line n
line 1  line 2
line 3  line 4
line 5  line 6
...     
line n-1 line n

【讨论】:

【解决方案2】:

“Klas Lindbäck”提供的答案是绝对正确的。只是为了让可能有类似困惑的人更清楚,我正在写这个答案。我创建了一个由红色组成的奇数行和由蓝色组成的偶数行的图像。

然后,我使用了原始帖子中给出的代码。正如“Klas Lindbäck”的回答所预料的那样,红色进入第一列,蓝色进入第二列。

原图:

生成的图像:

【讨论】:

    猜你喜欢
    • 2019-09-24
    • 2013-10-11
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    相关资源
    最近更新 更多