2013-08-01 7 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

Можете ли вы также показать другие места, на которые ссылается imgused? –

ответ

1

Кроме того, необходимо предоставить код, в котором imgused определен. Кроме того, есть некоторые другие проблемы с кодом.

В качестве побочного эффекта использования C API из OpenCV, легко утечка памяти:

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; 
    } 

Кроме того, необходимо, чтобы освободить память, связанные с указателями tempPrev и temp2 в соответствующем месте:

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

Вы можете рассмотреть возможность использования C++ API для того, чтобы избежать проблем с управлением памятью.