理解memcpy()完成的复制

skm*_*skm 6 opencv memcpy c++11

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

虽然这是一个非常简单的任务,但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;
}
Run Code Online (Sandbox Code Playgroud)

原始图片:

此搜索

结果

图像2

预期成绩:

图像3

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

Kla*_*äck 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
Run Code Online (Sandbox Code Playgroud)

  • "猫"显然是[皮卡丘](https://duckduckgo.com/?q=pikachu&t=opera&ia=images). (12认同)

skm*_*skm 5

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

然后,我使用了原始帖子中给出的代码.正如"KlasLindbäck"的答案所期望的那样,红色进入第一列,蓝色进入第二列.

原始图片:

图片

结果图片:

图像2