【发布时间】: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 这很有可能。