2015-07-28 71 views
6

我必須創建一個圖像,其中有兩倍於原始圖像的列數。因此,我將新圖像的寬度保持爲原始圖像的寬度的兩倍。瞭解由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; 
} 

原始圖像:

image1

結果

image2

預期結果:

image3

問:當得到的圖像僅僅是兩次以原始圖像的話,怎麼來的4張圖像,越來越複製到新的圖像?其次,memcpy()以連續的方式複製連續內存位置,因此,我應該得到「預期結果」中顯示的圖像。

+0

這是什麼線'爲size_t memsize個= 3 * * image.rows image.cols;' ?特別是'3'? –

+3

@SouravGhosh我懷疑R,G,B組件的每個像素是3個字節。 –

+0

@TheParamagneticCroissant在這種情況下,不像'twoTimesImage'缺少'image.rows'的乘數2。純粹的猜測,但。 –

回答

7

左邊的貓由奇數行組成,右邊的貓由原始圖片的偶數行組成。然後它翻倍,所以下面還有兩隻貓。新貓只有原貓數量的一半。

新畫面佈局是這樣的:

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 
+9

「貓」顯然是[皮卡丘](https://duckduckgo.com/?q=pikachu&t=opera&ia=images)。 – nwp

5

通過「克拉斯Lindbäck」提供的答案是絕對正確的。只是爲了給可能有類似困惑的人提供更多的清晰度,我正在寫這個答案。我創建了一個由紅色組成的奇數行圖像和由藍色組成的行。

然後,我用我原來的帖子給出的代碼。正如「KlasLindbäck」的答案所預料的那樣,紅色出現在第一欄,藍色出現在第二欄。

原始圖像:

image

得到的圖像:

image2