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

news/2024/7/21 7:34:17 标签: iphone, frameworks, image, 图像处理, xcode, null

转自: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了你原来转换的那两个代码,好像别人在真机上也使用过,应该没有什么问题;

而且我没有做任何处理,就是做了一次转换,结果好像整个程序都蹦了images/post/smile/default/11.gif" alt="" />

我的版本是ios3.1.3,另外我是直接把你的那个.mm文件加进来,其他的代码都是.m文件,不知到这个有没有关系;

另外你特别提出的把libcv.a libcvcore.a两个库加进来,这两个库文件和其他一些库文件已经包含在你提供的opencv/lib下了

需要单独在xcodeframeworks那一列下再加一次?

 

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一点都没接触过。。。 images/post/smile/default/9.gif" alt="" />

 

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];

一上午基本都是同样的结果images/post/smile/default/8.gif" alt="" />

 

grissom2011-03-04 13:25
终于找到原因了:
http://subversion.assembla.com/svn/caviar/Trunk/openCVTest/Classes/OpenCVTestViewController.m
原来iplimage<->uiimage的时候,还要要做bgr<->rgb的变换
探花同学的方法里面iplimage<-uiimage有rgb->bgr这个变换,反过来的好像单独写在别的地方了,我应该给漏掉了

不过,为啥在模拟器上面运行的时候不出问题呢?images/post/smile/default/11.gif" alt="" />

http://www.niftyadmin.cn/n/1054839.html

相关文章

Topshelf创建windows服务初探

概述 Topshelf是创建Windows服务的另一种方法&#xff0c;老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的介绍使用使用Topshelf创建Windows 服务。Topshelf是一个开源的跨平台的宿主服务框架&#xff0c;支持Windows和Mono&#xff0…

Java程序设计综合项目实训二——博客一

职务姓名学号组长张广哲16012007组员陈炳全16012022组员葛晨延16012010组员周楷柠16012005博客地址&#xff1a; 张广哲(组长):http://www.cnblogs.com/zgz187/ 陈炳全:http://www.cnblogs.com/x-alchemist/ 葛晨延:http://www.cnblogs.com/happywindman/ 周楷柠:http://www.cn…

关于linux内核中断处理和内核抢占的两个说明

中断处理不能睡眠和切换&#xff1a;原因随处可以找到&#xff0c;总结起来就是&#xff1a;1.增加了当前任务的不确定性&#xff0c;实时性能得不到保障&#xff0c;毕竟中断上下文是任意进程上下文&#xff0c;这样对那个被中断的进程不公平&#xff0c;我在邮件列表中的原话…

解决死锁问题-设置加锁顺序

大部分死锁都是由于不恰当的加锁顺序造成的&#xff0c;例如&#xff0c;线程A持有lock1等待lock2&#xff0c;而线程B持有lock2等待lock1&#xff0c;解决办法是每个线程都以相同的顺序获取多个锁。 先看一个由于错误的加锁顺序导致的死锁&#xff1a; public class Transfe…

2017-2018-1 20155222 201552228 实验二 固件程序设计

2017-2018-1 20155222 201552228 实验二 固件程序设计 实验内容 固件程序设计-1-MDK 固件程序设计-2-LED 固件程序设计-3-UART 固件程序设计-4-国密算法 固件程序设计-5-SM1 固件程序设计-6-清理 实验要求 注意不经老师允许不准烧写自己修改的代码两人&#xff08;个别三人&…

[转]使用iPhone三轴感应器的代码例子

转自&#xff1a;http://www.cocoachina.com/iphonedev/sdk/2010/0624/1749.html 很多应用里都要用到苹果iPhone自带的三轴感应器&#xff08;加速度传感器&#xff09;&#xff0c;希望下面这段代码例子能为您使用iPhone三轴感应器打开思路。 #include <IOKit/IOKitLib.h&g…

排序检索数据

SELECT prod_nameFROM Products;# 这样直接检索出的单个列&#xff0c;并没有特定的顺序-- 关系数据库设计理论认为&#xff0c;如果不明确规定顺序排序&#xff0c;则不应该假定检索出的数据的顺序有任何意义 -- 为了明确的进行排序可使用order by 字句(order by字句出现的位置…

Mac显示器不亮

上班的时候mac连接上显示器&#xff0c;但是显示器并没有亮&#xff0c;于是乎各种插拔ing...偶尔一两次还可以接受&#xff0c;但是天天这样小身板招架不住呀&#xff0c;于是乎终于找到一个可以让显示器快速亮起的方法&#xff0c;遂赶紧分享给各位小火鸡~ 唤起显示器 拔掉转…