我必须创建一个图像,其列数是原始图像的两倍。因此,我将新图像的宽度保持为原始图像的两倍。
虽然这是一项非常简单的任务,但我已经完成了但是我想知道使用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()
以行方式复制连续的内存位置,因此我应该得到一个显示在“预期结果”中的图像。
答案 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)