【问题标题】:Create gray IplImage from gray UIImage从灰色 UIImage 创建灰色 IplImage
【发布时间】:2011-09-08 07:47:59
【问题描述】:

我正在尝试使用以下方法从灰度 UIImage 和 Im 创建一个灰色 IplImage。

- (IplImage *)createGrayIplImageFromUIImage:(UIImage *)image {

    CGImageRef imageRef = [image CGImage];

    CFDataRef dat = CGDataProviderCopyData(CGImageGetDataProvider(imageRef));

    const unsigned char *buffer = CFDataGetBytePtr(dat);
    IplImage *iplimage = cvCreateImage(cvSize(image.size.width, image.size.height), IPL_DEPTH_8U, 1);
    for (int i=0; i<image.size.width*image.size.height; i++) {
        iplimage->imageData[i] = buffer[i];
        NSLog(@"in creategrayiplimage - %d --- %d",buffer[i], iplimage->imageData[i]);
    }
    return iplimage;
}

当我在 for 循环中记录数据时,缓冲区具有正确的值 (0-255),但 iplimage->imageData 具有签名值,甚至其 IPL_DEPTH_8U。

例如

在 creategrayiplimage - 149 --- -107 在 creategrayiplimage - 247 --- -9 在 creategrayiplimage - 127 --- 127 在 creategrayiplimage - 128 --- -128

这似乎是一个小问题,但我被困住了,我想知道为什么我从 iplimage 得到负值。提前致谢

【问题讨论】:

    标签: ios opencv uiimage grayscale iplimage


    【解决方案1】:

    一个字节就是一个字节。数据本身不知道它是有符号还是无符号——这完全取决于您如何解释数据。

    将您的 NSLog() 语句更改为使用 %u (unsigned int) 而不是 %d (signed int) 作为格式说明符,您的数据将显示为无符号。

    【讨论】:

    • 它不适用于 %u。在 creategrayiplimage - 126 --- 126 在 creategrayiplimage - 132 --- 4294967172。它如何正确显示缓冲区与 %d 而不是 iplimage? %u 也没有帮助。
    • 在 NSLog() 之前的行中,您设置了 iplimage-&gt;imageData[i] = buffer[i],因此您知道它们必须相等。根据this page,imageData 字段的类型是char*,但请确保您的 IplImage 定义与此一致。
    • 谢谢!当我这样改变它时它起作用了。 for (int i=0; iimageData[i] = (uchar) buffer[i]; NSLog(@"in creategrayiplimage - %d --- %u",buffer[i], (uchar)iplimage->imageData[i]); } 返回 iplimage;
    猜你喜欢
    • 2011-09-08
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 2015-03-25
    • 2017-03-21
    • 2014-03-20
    • 1970-01-01
    相关资源
    最近更新 更多