转自:http://www.cocoachina.com/bbs/simple/?t33693.html
123探花
2010-09-29 14:10grissom2011-03-03 23:20探花同学还在吗?用你的demo里面的程序在真机上调试好像由点问题:在执行以下代码后(直接从demo里面拷贝过来):UIImage *uiimage2 = [UIImage imageWithContentsOfFile:图像路径];//图像是拍照得到,以nsdata形式存储下来的,不知道这个有没有什么影响; //尺寸变换,没有问题; [converter myResize:uiimage2 dstimage:uiimage size:size]; //创建ipl图 iplimg = cvCreateImage(cvsize, IPL_DEPTH_8U,3); //将uiimage类型转换为iplimage类型; [converter myUIImage2IplImage:uiimage dstimage:iplimg]; //再转换回uiimage类型; [converter myIplImage2UIImage:iplimg dstimage:uitemp]; //在真机上显示; self.imageView.image = uitemp;不做任何图像处理,仅仅是转换后,图像变成一些彩色的稀疏的点在白背景上面排列的样子,原来图像信息完全丢失而在模拟器上是好的,不知道这是怎么回事;
123探花2011-03-04 09:41demo 里面的代码全部是基于模拟器的。 因为架构不同所以有些函数真机上有错误发一个我新版的 myIplImage2UIImage 函数- (UIImage *)myIplImage2UIImage:(IplImage *)image{ //NSLog(@"IplImage (%d, %d) %d bits by %d channels, %d bytes/row %s", image->width, image->height, image->depth, image->nChannels, image->widthStep, image->channelSeq); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); //都用rgb格式的 IplImage * iplbuf = cvCreateImage(cvGetSize(image),8, 3); cvCvtColor(image, iplbuf, CV_BGR2RGB); CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, iplbuf->imageData, iplbuf->nChannels * iplbuf->width * iplbuf->height, NULL ); CGImageRef imageRef = CGImageCreate(iplbuf->width, iplbuf->height, 8,24, iplbuf->widthStep,colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault, provider, NULL, FALSE, kCGRenderingIntentDefault); cvReleaseImage(&iplbuf); UIImage * dstimage = [ [UIImage alloc] init]; [dstimage initWithCGImage:imageRef]; CGImageRelease(imageRef); CGDataProviderRelease(provider); CGColorSpaceRelease(colorSpace); //NSLog(@"dstimage size: %d",[dstimage size]); return [dstimage autorelease];}
magicfish2011-03-04 09:44探花同学,能写个透视校正的demo么?要实现图1中那种效果!非常感谢。感觉opencv很强大,很好的东西啊
grissom2011-03-04 09:50谢谢探花同学及时的回复我也google了你原来转换的那两个代码,好像别人在真机上也使用过,应该没有什么问题;而且我没有做任何处理,就是做了一次转换,结果好像整个程序都蹦了我的版本是ios3.1.3,另外我是直接把你的那个.mm文件加进来,其他的代码都是.m文件,不知到这个有没有关系;另外你特别提出的把libcv.a libcvcore.a两个库加进来,这两个库文件和其他一些库文件已经包含在你提供的opencv/lib下了需要单独在xcode的frameworks那一列下再加一次?
123探花2011-03-04 10:06那两个转换。 我也经常真机上用到。 应该是没有问题的。 你确定下libcv.a libcvcore.a 是不是device版本的。 或者是这样改下 UIImage * uiimage = [UIImage new];uiimage = [UIImage imageWithContentsOfFile:图像路径];估计是UIImage提前释放了
123探花2011-03-04 10:07这opencv能做到。 但不是一个小工程。 我对透视校正这方面还没什么研究
magicfish2011-03-04 10:14哦,多谢了。终于知道用什么技术实现了。。。可是opencv一点都没接触过。。。
grissom2011-03-04 12:20探花同学,用你的新方法在真机上还是不行,可以确定是用的device的库,不然会报错;之前你提到的uiimage的位置问题确实有影响,但是那样只会导致程序运行不正常,和转换结果图像关系不大,我也改过来了;现在程序不会崩溃,就是做uiimage->iplimage->uiimage这么歌转化,真机显示出来的就基本是白背景下一些稀疏的彩色的点;下面是代码,:int width = 200; int height = 200; UIImage *uiimage = [UIImage imageWithContentsOfFile:图像路径]; IplImage *myIplImg; myImageConverter *converter = [myImageConverter new]; UIImage *myImg; myImg = [UIImage new]; CGSize size = CGSizeMake(width, height); CvSize cvsize; cvsize.width = width; cvsize.height = height; [converter myResize:uiimage dstimage:myImg size:size]; myIplImg = cvCreateImage(cvsize, IPL_DEPTH_8U, 3); [converter myUIImage2IplImage:myImg dstimage:myIplImg]; UIImage *uitemp = [converter myIplImage2UIImage:myIplImg]; [imageView setImage:uitemp]; [converter release]; [myImg release];一上午基本都是同样的结果
grissom2011-03-04 13:25终于找到原因了:http://subversion.assembla.com/svn/caviar/Trunk/openCVTest/Classes/OpenCVTestViewController.m原来iplimage<->uiimage的时候,还要要做bgr<->rgb的变换探花同学的方法里面iplimage<-uiimage有rgb->bgr这个变换,反过来的好像单独写在别的地方了,我应该给漏掉了不过,为啥在模拟器上面运行的时候不出问题呢?