我必須創建一個圖像,其中有兩倍於原始圖像的列數。因此,我將新圖像的寬度保持爲原始圖像的寬度的兩倍。瞭解由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;
}
原始圖像:
結果
預期結果:
問:當得到的圖像僅僅是兩次以原始圖像的話,怎麼來的4張圖像,越來越複製到新的圖像?其次,memcpy()
以連續的方式複製連續內存位置,因此,我應該得到「預期結果」中顯示的圖像。
這是什麼線'爲size_t memsize個= 3 * * image.rows image.cols;' ?特別是'3'? –
@SouravGhosh我懷疑R,G,B組件的每個像素是3個字節。 –
@TheParamagneticCroissant在這種情況下,不像'twoTimesImage'缺少'image.rows'的乘數2。純粹的猜測,但。 –