[转]iphone项目中使用opencv教程

    技术2022-05-19  22

    转自:http://www.cocoachina.com/bbs/simple/?t33693.html

    123探花

    2010-09-29 14:10

    iphone项目中使用opencv教程

    - -!好复杂啊。。。不过做出来的话,功能应该不错,这就研究去~拜谢探花啊,你改名叫状元得了~

     

    grissom2011-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这个变换,反过来的好像单独写在别的地方了,我应该给漏掉了不过,为啥在模拟器上面运行的时候不出问题呢?

    最新回复(0)