Ios 从灰度图像创建灰度图像
我正在尝试从灰度图像创建一个灰度图像,我使用下面的方法Ios 从灰度图像创建灰度图像,ios,opencv,uiimage,grayscale,iplimage,Ios,Opencv,Uiimage,Grayscale,Iplimage,我正在尝试从灰度图像创建一个灰度图像,我使用下面的方法 - (IplImage *)createGrayIplImageFromUIImage:(UIImage *)image { CGImageRef imageRef = [image CGImage]; CFDataRef dat = CGDataProviderCopyData(CGImageGetDataProvider(imageRef)); const unsigned char *buffer = C
- (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;
}
-(IplImage*)从UIImage创建灰度IplImage:(UIImage*)图像{
CGImageRef imageRef=[图像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);
对于(inti=0;iimageData[i]=buffer[i];
NSLog(@“在creategrayiplimage-%d---%d”,缓冲区[i],iplimage->imageData[i]);
}
返回iplimage;
}
当我将数据记录到for循环中时,缓冲区有正确的值(0-255),但iplimage->imageData甚至其IPL_DEPTH_8U也有带符号的值
e、 g
在CreateGrayLimage-149----107中
在CreateGrayLimage-247----9中
在CreateGrayLimage-127--127中
在creategrayiplimage-128----128中
这似乎是一个小问题,但我被卡住了,我想知道为什么我会从iplimage中得到负值。提前感谢一个字节就是一个字节就是一个字节。数据本身不知道它是有符号的还是无符号的——这都取决于如何解释数据
将NSLog()语句更改为使用%u(无符号整数)而不是%d(有符号整数)作为格式说明符,您的数据将显示为无符号。字节就是字节。数据本身不知道它是有符号的还是无符号的——这完全取决于您如何解释数据
将NSLog()语句更改为使用%u(无符号整数)而不是%d(有符号整数)对于格式说明符,您的数据将显示为无符号。它不适用于%u。在creategrayiplimage-126--126中,在creategrayiplimage-132--4294967172中。它如何使用%d正确显示缓冲区,而不使用iplimage?同样%u没有帮助。在NSLog()前面的行上,您设置了
iplimage->imageData[i]=buffer[i]
,因此您知道它们必须相等。根据,imageData字段的类型为char*
,但请确保您的IplImage定义与此一致。谢谢!当我这样更改它时,它起了作用。对于(int I=0;iimageData[I]=(uchar)buffer[I];NSLog(@“in creategrayiplimage-%d---%u),buffer[I],(uchar)iplimage->imageData[i]);}返回iplimage;它不适用于%u。在creategrayiplimage-126--126中,在creategrayiplimage-132--4294967172中。它如何使用%d正确显示缓冲区,而不使用iplimage?同样%u没有帮助。在NSLog()前面的行上,您设置iplimage->imageData[i]=buffer[i]
,因此您知道它们必须相等。根据,imageData字段的类型为char*
,但请确保您的IplImage定义与此一致。谢谢!当我这样更改它时,它起了作用。对于(int I=0;iimageData[I]=(uchar)buffer[I];NSLog(@“in creategrayiplimage-%d---%u),buffer[I],(uchar)iplimage->imageData[i]);}返回iplimage;