了解 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" 的答案所预期的那样,红色进入第一列,蓝色进入第二列。
原图:
结果图像:
我必须创建一个图像,其列数是原始图像列数的两倍。因此,我将新图的宽度保持为原图宽度的两倍。
虽然这是一个非常简单的任务,我已经完成了,但是我想知道使用 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" 的答案所预期的那样,红色进入第一列,蓝色进入第二列。
原图:
结果图像: