Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 理解memcpy()所做的复制_Opencv_C++11_Memcpy - Fatal编程技术网

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这是很有可能的。