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

本文档详细讨论了如何在iPhone项目中使用OpenCV进行图像处理,并针对在真实设备上遇到的问题进行了深入探讨,提供了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自: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:41
demo 里面的代码全部是基于模拟器的。  因为架构不同所以有些函数真机上有错误


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

不过,为啥在模拟器上面运行的时候不出问题呢?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值