了解 memcpy() 完成的复制

Understanding the copy done by memcpy()

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

虽然这是一个非常简单的任务,我已经完成了,但是我想知道使用 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() 以行方式复制连续的内存位置,因此,据此我应该得到一张显示在 "Expected results".

中的图像

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

新图是这样布置的:

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

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

然后,我就用了我原来给的代码post。正如 "Klas Lindbäck" 的答案所预期的那样,红色进入第一列,蓝色进入第二列。

原图:

结果图像: