0

我正在尝试使用 leptonica 的 pixOtsuAdaptiveThreshold 函数,但运气不佳。我不确定我是否做得对,但我正在尝试获取 UIImage(objective-C),应用 pixOtsuAdaptiveThreshold,然后转换回 UIImage。当我使用传入的参数调用 pixOtsuAdaptiveThreshold 时,它会崩溃。

谁能告诉我我做错了什么?我已经为此苦苦挣扎了 2 天,我想我正在失去理智。谢谢!

代码

-(void)leptnoica:(UIImage *)image {

CGImageRef myCGImage = image.CGImage;
CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider(myCGImage));
const UInt8 *imageData = CFDataGetBytePtr(data);

PIX *myPix = (PIX *) malloc(sizeof(PIX));
myPix->w = (int)CGImageGetWidth (myCGImage);
myPix->h = (int)CGImageGetHeight (myCGImage);
myPix->d = (int)CGImageGetBitsPerComponent(myCGImage);
myPix->wpl =  (CGImageGetBytesPerRow (myCGImage)/4);
             // myPix->informat = IFF_TIFF;
myPix->informat= IFF_PNG;
myPix->data = (l_uint32 *) imageData;
myPix->colormap = NULL;
l_int32 one=300;
PIX *pixg;
PIX *pixB;

pixg = (PIX *) malloc(sizeof(PIX));
pixg=pixConvertTo8(myPix, 0);
l_float32 scorefract=0.1f;
pixOtsuAdaptiveThreshold(pixg, one, one, 0, 0, scorefract,NULL,&pixB);
4

1 回答 1

0

首先,您应该始终使用 leptonica 构造函数(例如,pixCreate())和 leptonica 访问器(例如,pixGetDimensions())。永远不要直接访问任何字段。所有访问器都测试参数并且设计为不会使您的程序崩溃,即使您提供了错误的输入。查看 prog 目录中的一些程序以获取使用示例。

其次,CGImage 可能具有与 leptonica 不同的字节顺序,并且它可能具有不同的像素和行填充。您需要了解这两种数据格式并进行适当的转换。

于 2013-06-17T18:28:19.213 回答