理解memcpy()完成的复制

时间:2015-07-28 10:13:16

标签: opencv c++11 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;
}

原始图片:

image1

结果

image2

预期结果:

image3

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

2 个答案:

答案 0 :(得分:8)

左猫由奇数行组成,右猫由原始图片的偶数行组成。然后加倍,以便下面还有两只猫。新猫的原始猫数量只有一半。

新图片的布局如下:

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

答案 1 :(得分:5)

“KlasLindbäck”提供的答案绝对正确。为了给可能有类似困惑的人提供更多清晰度,我正在写这个答案。我创建了一个图像,其中包含由红色组成的奇数行和由蓝色组成的偶数行。

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

原始图片:

image

产生的图片:

image2