【问题标题】:Converting pbm files into IplImage将 pbm 文件转换为 IplImage
【发布时间】:2011-07-20 04:34:21
【问题描述】:

显然,这段代码在最后一行 cvCvtColor() 处给了我错误,有什么问题?这个功能有什么可以改进的吗?

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

【问题讨论】:

    标签: iphone ios opencv


    【解决方案1】:

    你将 C++ 接口 (cv::Mat) 与 C 接口 (IplImage) 混合在一起,为什么要这样做?

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

    这是内存泄漏,您永远不会删除该映射,也几乎没有理由使用 new 创建一个 Mat - 只需 Mat mat(width, height, CV_8UC4) 就可以了,您不需要删除它。

    cvCvtColor(mat, rv, CV_RGBA2BGR);
    

    cvCvtColor 需要两个IplImage*s 作为参数,你给它一个cv::Mat* 和一个IplImage*,这是行不通的。将第一个mat 替换为&amp;iplImage,或者始终使用c++ 接口。

    【讨论】:

    • 感谢您的输入,我的首要任务是将 pbm 转换为 IplImage,一旦完成,我将继续进行清理和优化。现在的问题是,当我在 ImageView 中查看它时,我会得到垃圾模糊的抽象图像。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多