2011-03-22 6 views
0

분명히이 코드는 마지막 줄에 cvCvtColor() 오류가 있습니다. 무엇이 잘못 되었습니까? 이 기능에서 향상시킬 수있는 것이 있습니까?pbm 파일을 IplImage로 변환

+(IplImage*) LoadPbmAsIplImage: (NSString*) fileName{ 
    NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"pbm"]; 
    NSData *data = [NSData dataWithContentsOfFile:filePath]; 
    NSString *content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSArray *lines = [content componentsSeparatedByString:@"\n"]; 
    NSString *secondLine = [lines objectAtIndex:1]; //because first line (index 0) contains meta data 
    int width = [secondLine length]; 
    int height = [lines count]-1; 
    Mat *mat = new Mat(width, height, CV_8UC4); 
    MatIterator_<uint> it = mat->begin<uint>(); 
    for (int i=0; i<[lines count]; i++){ 
     for (int j=0; j<[[lines objectAtIndex:i] length]; j++){ 
      int pixelValue = 0; 
      if ([[lines objectAtIndex:i] characterAtIndex:j] == '1'){ 
       pixelValue = 255; 
      } 
      *it = pixelValue; 
     } 
    } 
    IplImage iplImage = *mat; 
    IplImage* rv = cvCreateImage(cvSize(iplImage.width, iplImage.height), IPL_DEPTH_8U, 3); 
    cvCvtColor(mat, rv, CV_RGBA2BGR); 
    return rv; 
} 

답변

1

C 인터페이스 (cv :: Mat)를 C 인터페이스 (IplImage)와 혼합합니다. 왜 그렇게할까요? 단지 Mat mat(width, height, CV_8UC4) 작업 벌금을하지, 당신은 그것을 삭제할 필요가 없습니다 -

Mat *mat = new Mat(width, height, CV_8UC4); 

이 메모리 누수가, 당신이지도를 삭제하지, 새로운와 매트를 만드는 거의없는 이유가있다.

cvCvtColor(mat, rv, CV_RGBA2BGR); 

cvCvtColor는 인수로 두 IplImage*의 기대, 당신은이 cv::Mat*IplImage*,이 작동하지 않을 수 있습니다 제공합니다. 첫 번째 mat&iplImage으로 바꾸거나 지속적으로 C++ 인터페이스를 사용하십시오.

+0

입력 해 주셔서 감사합니다. 우선, pbm에서 IplImage로 변환하는 것이 가장 중요합니다. 일단 완료되면 정리 및 최적화를 진행할 것입니다. 문제는 지금 내가 ImageView에서 볼 때 정크 모호한 추상적 인 이미지를 얻는 것입니다. – Haoest