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

来源:互联网 发布:win10电脑优化软件哪个 编辑:程序博客网 时间:2024/05/21 04:39

转自: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这个变换,反过来的好像单独写在别的地方了,我应该给漏掉了

不过,为啥在模拟器上面运行的时候不出问题呢?