2013-08-01 88 views
0

每次我想使用函數Generate3DProfile與條件,生成應該從當前索引開始我得到cv :: Exception在內存位置0x0024EFD4錯誤,直到如果(!imgused [i] )繼續; 。但是,當我做出對整個序列生成沒有錯誤,這裏是代碼的重要組成部分:OpenCV 2.4.5運行時錯誤內存

void TPictureWindow::Generate3DProfile() 
{ 
char buffer[MAX_PATH]; 
int value, newHeight, newWidth, refYpos = 0; 

IplImage* transformB = cvCreateImage(cvSize(m_imgSequence[0]->width, NumImages), IPL_DEPTH_8U, 1); 
IplImage* transformG = cvCreateImage(cvSize(m_imgSequence[0]->width, NumImages), IPL_DEPTH_8U, 1); 
IplImage* transformR = cvCreateImage(cvSize(m_imgSequence[0]->width, NumImages), IPL_DEPTH_8U, 1); 

cvZero(transformB); 
cvZero(transformG); 
cvZero(transformR); 

for(int i = 0; i < NumImages; i++) 
{ 
    if(!imgused[i]) continue; 

    for(int j = 0; j < edge[i][0]->total; j++) 
    { 
     MessageBox("hallo", "", MB_OK); 
     CvPoint* pt1 = CV_GET_SEQ_ELEM(CvPoint, edge[i][0], j); 
     CvPoint* pt2 = CV_GET_SEQ_ELEM(CvPoint, edge[i][1], j); 

     value = (pt1->y-pt2->y)*1000*scaling; 
     //sprintf_s(buff3,"%d", value); 
     //MessageBox(buff3, "", MB_OK); 
     if(value < 0) value = 0; 
     transformB->imageData[i*transformB->widthStep+pt1->x] = value%256; 
     transformG->imageData[i*transformG->widthStep+pt1->x] = value/256; 
    } 
} 
IplImage* final = cvCreateImage(cvSize(m_imgSequence[0]->width, NumImages), IPL_DEPTH_8U, 3); 
cvMerge(transformB, transformG, transformR, NULL, final); 
cvFlip(final,final); 

if(isFirst){ 
    cvSaveImage(outFileName, final); 
    isFirst = false; 
}else{ 

    //sprintf_s(buffer, "%s%04d%s", TempFileName, prevIndex, ".tif"); 
    IplImage* tempPrev = cvLoadImage(outFileName,CV_LOAD_IMAGE_COLOR);//name ändern 
    if(imgIndex/100 == prevIndex/100){ 
     newHeight = tempPrev->height >= final->height*(imgIndex%100+1)?tempPrev->height : tempPrev->height+final->height; 
     newWidth = tempPrev->width; 
     newYpos = (imgIndex/100)%2 > 0 ? newYpos-final->height : newYpos+final->height; 
     if(newYpos < 0){ 
      newYpos = 0; 
      refYpos = final->height;//fall dass es unten noch weitere blöcke gibt 
     } 
    }else{ 
      newHeight = tempPrev->height; 
      newWidth = tempPrev->width+final->width; 
      newXpos += final->width; 
    } 
     IplImage* temp2 = cvCreateImage(cvSize(newWidth, newHeight), IPL_DEPTH_8U, 3); 
     cvZero(temp2); 
     cvSetImageROI(temp2, cvRect(0,refYpos, tempPrev->width, tempPrev->height)); 
     cvCopy(tempPrev, temp2); 
     cvSetImageROI(temp2,cvRect(newXpos, newYpos, final->width, final->height)); 
     cvCopy(final, temp2); 
     cvResetImageROI(temp2); 
     cvSaveImage(outFileName, temp2); 
    } 
    //sprintf_s(buffer, "%s%04d%s", TempFileName, imgIndex, ".tif"); 

    PostMessage(READY_WITH, IMG_3D_PROFILE, 0); 
} 

更新部分:

哦確定,我發現該imgused這應該是1或0的值是69,這很奇怪。在我的代碼的其他部分這種使用它的方式起作用。這裏聲明部分:類TPictureWindow:

public TWindow 
{ 
private: 
bool isBorders, isDoWhiteLine, isLoaded, isMultiple, useRoi4all, canBuild, isFirst; 
char TempFileName[MAX_PATH], outFileName[MAX_PATH]; 
unsigned int NumImages, ImgWidth, ImgHeight; 
int refracidx, lini, actualPicIndex, newindex, imgIndex, abort, prevIndex, newXpos, newYpos; 
bool imgused[MAX_IMAGES]; 
double scaling, deltaX, deltaY; 
+0

你還可以顯示其他被引用的地方嗎? –

回答

1

你還需要給地方imgused定義的代碼。另外,代碼還有一些其他問題。

由於使用的OpenCV的C API的副作用,很容易造成內存泄漏:

CvPoint* pt1 = CV_GET_SEQ_ELEM(CvPoint, edge[i][0], j); 
    CvPoint* pt2 = CV_GET_SEQ_ELEM(CvPoint, edge[i][1], j); 

對於每一個你定義的CvPoint這些指針循環,但走出去的,當你不刪除在每一次迭代中的範圍。爲了防止這種泄漏,你可以寫:

for(int j = 0; j < edge[i][0]->total; j++) 
    { 
     MessageBox("hallo", "", MB_OK); 
     CvPoint* pt1 = CV_GET_SEQ_ELEM(CvPoint, edge[i][0], j); 
     CvPoint* pt2 = CV_GET_SEQ_ELEM(CvPoint, edge[i][1], j); 

     value = (pt1->y-pt2->y)*1000*scaling; 
     //sprintf_s(buff3,"%d", value); 
     //MessageBox(buff3, "", MB_OK); 
     if(value < 0) value = 0; 
     transformB->imageData[i*transformB->widthStep+pt1->x] = value%256; 
     transformG->imageData[i*transformG->widthStep+pt1->x] = value/256; 
     delete pt1; //delete pointers 
     delete pt2; 
    } 

您還需要釋放與指針tempPrevtemp2在適當的地方回憶:

... 
    cvResetImageROI(temp2); 
    cvSaveImage(outFileName, temp2); 
    cvReleaseImage(&tempPrev); 
    cvReleaseImage(&temp2); 

您可以依次考慮使用C++ API避免內存管理問題。