2013-04-16 130 views
1

我擁有一個圖像內存,我將它儲存並保存在一個指針中,以便不丟失其地址。使用OpenCV複製時指定指針

現在我想通過以下功能的memcpy(我已經測試)將其分配到的IplImage結構:

IplImage* img=cvCreateImage(cvSize(640, 480), IPL_DEPTH_16U, 1); 
VOID* ImgMem; 
memcpy(img->imageData, ImgMemory, (640*480)); 

這真的不起作用。它聲稱Unhandled exception at 0x001b96dd in ex4.exe: 0xC0000005: Access violation reading location 0x00000044

任何想法如何處理?

+0

我在OpenCV中沒有專家,但我假設你應該爲數據分配空間。 – Xymostech

回答

0

您的圖像爲640x480,但您複製了916x916像素。

+0

錯誤已修復。但仍然沒有改變。 – user2187476

+0

你爲ImgMemory分配了內存嗎?這是您程序中的第二個問題。 –

+0

不,我沒有! – user2187476

0

你的代碼有兩個問題。第一個問題是你沒有初始化'ImgMem'。

VOID* ImgMem; 
// ^^^^^^ Points to whatever 

如果在將數據複製到圖像緩衝區之前需要使用緩衝區,則需要爲其分配內存。

int bufferSize = 640*480*2; 
char* ImgMem = new char[bufferSize]; 

確保在完成存儲操作後刪除內存,否則將導致內存泄漏。

delete[] ImgMem; 

更好的選擇是使用std::vector;

std::vector<char> ImgMem(bufferSize, 0); 

memcpy(img->imageData, &ImgMem[0], ImgMem.size()); 

這樣的內存分配,管理和std::vector,而不是你不必每次都要去做釋放。

第二個問題是你試圖將更多的內存複製到圖像緩衝區中,而不是它可以容納的。

memcpy(img->imageData, ImgMemory, (916*916)); 

這將複製839056個字節時img->imageData只能容納307,200字節(假定8bpp的)。

[編輯:此答案沒有考慮到IplImage結構提供的屬性。這包括在memcpy這裏相當重要的大小和對齊。有關的IplImage成員的更多信息,請參閱here]

+0

第一個問題已經解決。 第二:如何分配? – user2187476

+0

你如何爲一個void指針malloc? – user2187476

+0

@ user2187476不要使用malloc。看到更新答案 –

0

像素類型是無符號短IPL_DEPTH_16U,這是2個字節,因此,你需要計算相應的總字節數:

int totalSize = 640*480*2; 
char* ImgMemory = new char[totalSize]; 
memcpy(img->imageData, ImgMemory, (totalSize)); 
+0

行memcpy(img-> imageData,ImgMemory,(totalSize))仍然有問題。它給我帶來了同樣的問題 – user2187476

+0

'totalSize'計算不正確。它應該是'640 * 2 * 480',否則你會分配兩倍於圖像實際所具有的行數。 –

+0

@Captain Obvlious Sory計算錯誤 –