2012-09-25 115 views
0

是它沒關係這樣做的,代碼段當然是不完全的,只是爲了說明我的意思:OpenCV和(不)返回IplImages,什麼時候可以,什麼時候沒有?

void draw(IplImage* image){ 
cvLine(image,cvPoint(20,20),cvPoint(100,100),cvScalar(0,0,255),1);} 

int main(){ 

cvNamedWindow("preview",CV_WINDOW_AUTOSIZE); 
IplImage* image; 
image=cvCreateImage(cvSize(480,360),8,3); 
while(true){ 
draw(image); 
cvShowImage("preview",image); 
int ops=cvWaitKey(10) 
if ops!=-1 break;} 
cvReleaseImage(&image);cvDestroyWindow("preview");return 0; 
} 

還是會造成問題,如果我不返回IplImage結構是這樣的:

IplImage* draw(IplImage* image){ 
    cvLine(image,cvPoint(20,20),cvPoint(100,100),cvScalar(0,0,255),1);return image;} 

好吧,我問的原因是,如果我不返回IplImage有時它的工作原理。然而,在其他情況下,我可能會收到某種空指針錯誤消息。例如,如果我釋放函數中的圖像,然後在此之後重新創建它,仍然處於該函數中,可能會發生崩潰。

+0

()你是將指針'image'(指向IplImage結構...)的副本傳遞給函數void draw(IplImage * image){} ...在繪製函數內部,指向圖像的指針的副本被去參照並用於修改圖像(在你的案例中畫一條線......)所以不需要返回...如果你還回來,那麼也是一個警察y返回不是在main()中創建的原始圖像指針... –

+0

感謝您的評論rotate_image。我想我明白。如果我返回的圖像,你說的副本增加工作內存,並可能導致內存溢出? I.o.w.會返回圖像也沒關係? – user1331044

+0

將指針的副本傳遞給IplImage並不意味着你正在傳遞圖像的副本...其指向圖像的指針的副本...所以在32位機器上,指向圖像的指針的大小爲4個字節。 ..我不認爲這會導致內存溢出,如果你在循環中使用它也..但如果你使用cvCreateImage或cvLoadImage沒有cvReleaseImage循環內,那麼它可以導致內存溢出... –

回答

0

你不需要返回任何東西,但你絕對需要檢查失敗!

問題是你沒有安全編碼。在調用OpenCV函數時,您從不檢查失敗,這可能會導致draw()收到一個NULL指針作爲參數,這可能會導致崩潰或其他一些奇怪的行爲。

你應該做的第一件事就是開始防守編碼:

IplImage* image = cvCreateImage(cvSize(480,360),8,3); 
if (!image) 
{ 
    // print error and quit 
} 

,它不會傷害添加一個安全檢查自己的函數中:在主

void draw(IplImage* image) 
{ 
    if (!image) 
    { 
     // print error 
     return; 
    } 

    cvLine(image,cvPoint(20,20),cvPoint(100,100),cvScalar(0,0,255),1); 
} 
+0

是的,做更多的檢查時可能會有幫助,當試圖找到潛在的錯誤。感謝提示。 – user1331044

相關問題