Opencv 理解memcpy()所做的复制
我必须创建一个图像,它的列数是原始图像的两倍。因此,我将新图像的宽度保持为原始图像的两倍 虽然这是一项非常简单的任务,我已经完成了,但是我想知道使用Opencv 理解memcpy()所做的复制,opencv,c++11,memcpy,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,
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;
}
原始图像:
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;
}
结果
预期结果:
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()
以行方式复制连续内存位置,因此,根据这一点,我应该得到一个显示在“预期结果”中的图像。左cat由原始图片的奇数行组成,右cat由偶数行组成。然后,这是双倍的,所以有两个更多的猫下面。新的猫有原来猫一半的线数
新图片的布局如下:
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”提供的答案绝对正确。为了让可能有类似困惑的人更清楚,我写下了这个答案。我创建了一个图像,其中奇数行由红色组成,偶数行由蓝色组成
然后,我使用了我的原始帖子中给出的代码。正如“Klas Lindbäck”的答案所预期的那样,红色进入第一列,蓝色进入第二列
原始图像:
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;
}
结果图像:
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;
}
这行是什么
size\t memsize=3*image.rows*image.cols代码>?具体来说,3
?@SouravGhosh我怀疑R、G、B组件的每像素3字节。@在这种情况下,参数化牛角面包不像twootimeimage
缺少image.rows
的乘数2。不过纯粹是猜测。它是彩色图像,因此包含R、G和B通道。因此,每个像素包含3个字节。@SouravGhosh这是很有可能的。