问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在 iOS 工程中使用 OpenCV

发布网友 发布时间:2022-05-07 00:01

我来回答

1个回答

热心网友 时间:2023-10-09 01:53

第一步:首先去官网下载ios framwork ,人家编辑好的包,直接用很方便,链接:http://opencv.org/downloads.html

注意:opencv 3.0版本是beta版本,不稳定还缺少很多必要的库,请下载2.0以后,3.0以前版本,我下载的是2.4.13,16年5月19版本

第二步:下载的库直接可以拖到工程里,并且要添加以下framework:

添加以后这时候你build一下如果发现编译不过,出现了一个很蛋疼的错误缺少一个libjpg库,不要惊慌,请按照以下步骤;
http://sourceforge.net/projects/libjpeg-turbo/files/1.4.0/ 下载 libjpeg-turbo-1.4.0.dmg
安装这个库,然后你会在路径/opt/libjpeg-turbo/lib找到它libjpeg.a
打开终端输入 lipo -info /opt/libjpeg-turbo/lib/libjpeg.a 看是不是armv7 x86-64都全,然后把这个.a拷贝到你的工程目录下
然后把库拖进你的工程里 ,然后编译,就没有link错误了。

第三步 :写个测试程序,你可能需要把Mat类型转UIImage

[objc] view plain copy print?
//
// openUtil.h
// targetRecognition
//
// Created by x32 on 16/5/29.
// Copyright © 2016年 x32. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface openUtil : NSObject

+(cv::Mat)cvMatFromUIImage:(UIImage *)image;

+(UIImage *)UIImageFromCVMat:(cv::Mat)cvMat;
@end

[objc] view plain copy print?
//
// openUtil.m
// targetRecognition
//
// Created by x32 on 16/5/29.
// Copyright © 2016年 x32. All rights reserved.
//

#import "openUtil.h"

@implementation openUtil

+ (cv::Mat)cvMatFromUIImage:(UIImage *)image
{
CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);
CGFloat cols = image.size.width;
CGFloat rows = image.size.height;

cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels (color channels + alpha)

CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to data
cols, // Width of bitmap
rows, // Height of bitmap
8, // Bits per component
cvMat.step[0], // Bytes per row
colorSpace, // Colorspace
kCGImageAlphaNoneSkipLast |
kCGBitmapByteOrderDefault); // Bitmap info flags

CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage);
CGContextRelease(contextRef);

return cvMat;
}

+(UIImage *)UIImageFromCVMat:(cv::Mat)cvMat
{
NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()];
CGColorSpaceRef colorSpace;
// CGBitmapInfo bitmapInfo;

if (cvMat.elemSize() == 1) {
colorSpace = CGColorSpaceCreateDeviceGray();
} else {
colorSpace = CGColorSpaceCreateDeviceRGB();
}

CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);

// Creating CGImage from cv::Mat
CGImageRef imageRef = CGImageCreate(cvMat.cols, //width
cvMat.rows, //height
8, //bits per component
88 * cvMat.elemSize(), //bits per pixel
cvMat.step[0], //bytesPerRow
colorSpace, //colorspace
kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info
provider, //CGDataProviderRef
NULL, //decode
false, //should interpolate
kCGRenderingIntentDefault //intent
);

// Getting UIImage from CGImage
UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);

return finalImage;
}

@end

写个viewcontroller 里面显示一个UIImageView 引用一堆头文件 找张图片用以下程序测试一下

[objc] view plain copy print?
#import <opencv2/opencv.hpp>
#import <opencv2/imgproc/types_c.h>
#import <opencv2/core.hpp>
#import <opencv2/features2d.hpp>
#import <opencv2/calib3d.hpp>
#import <opencv2/objdetect.hpp>
#import <opencv2/nonfree/nonfree.hpp>
#import <opencv2/highgui.hpp>
#import <opencv2/imgproc.hpp>
#import <opencv2/objdetect/objdetect.hpp>

@property (weak, nonatomic) UIImageView *imgView;

-(void)corrosionPic
{
UIImage* image=[UIImage imageNamed:@"1.jpg"];
cv::Mat srcImage = [openUtil cvMatFromUIImage:image];
cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(15, 15));
cv::Mat dstImage;
cv::erode(srcImage, dstImage, element);
UIImage *dstImg = [openUtil UIImageFromCVMat:dstImage];

self.imgView.image =dstImg;
self.view.backgroundColor = [UIColor blackColor];

//cv::Mat srcImage1 = cv::imread( "1.jpg", 1 );
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...古代 近代 现代 当代 远古 。这些怎么传递的,还有评价是什么... 游离甲状腺素偏高是怎么回事 叶问前传有那些人拍? 有叶问前传里叶天赐这个人么 请问:1、小学教育与初中教育有什么不同? 2、小学教育与师范教育又... 北师大附小为什么好 考科二需要注意哪些 华为手机荣耀9和v9哪个比较好 万能钥匙wufai连网网速怎么样 我用迅雷下载了高清电影,用魔影工厂转换格式,出来一个窗口,是迅雷的让... 解压文件之后,只有一个txt文件,其他的什么都没有,请问这是什么原因 坐火车从长春到葫芦岛 葫芦岛到长春多少公里 现在从葫芦岛去长春的火车停运了吗? 2386次火车经停各站时刻表*2386火车经停各站时刻表 长春到葫芦岛动车往返票多少钱 查询去葫芦岛市的火车吉林市和长春市的! 长春到葫芦岛坐火车需要多长时间?车次? 辽宁葫芦岛到吉林长春 求水晶桂花糕做法! 泽国美食里的江南糕点哪种比较好吃? 这种运动套装里面一般配什么衣服 妈妈买了一大袋水果糖,4颗4颗地数多2颗,6颗6颗地数多4颗,9颗9颗地数多7颗。已知这袋糖的数量 把一些水果糖分给小朋友,每人分5颗,正好分完,如果每人分6颗,就少8颗,这些水果糖有多少颗? 小元有一盒水果糖,其中8颗红色,8颗绿色的,红色的和绿色的水果糖一样多吗? 李师准备了1□0颗水果糖,要平均分给八个小朋友.如果正好分完,这些糖至少有多 把10颗水果糖分给4个小朋友,至少有1个小朋友可以分得()颗水果糖;把18个苹果放在5个果盆里, 想知道,用什么糖果来当喜糖比较好呢? 戴姓叫嘉什么好听女孩 七十年代的一种水果糖,那时候是一分钱三颗,有谁知道的吗?很想念儿时的味道 HELP!以前吃过一种用彩色透明的糖果纸包装的糖,比较小,是水果糖,谁能告诉我它的名字啊?HELP!!! opencv 版本用哪个? 广西到长春火车时刻表从广西到长春经过哪些城市 vc++6.0配置什么版本的opencv最合适? 青岛到长春中间都路过哪些个火车站台 windows怎么查看opencv的版本 葫芦岛到长春高新区持有核酸检测还需要隔离吗? opencv版本选择(win7)\摄像头选择 怎么看opencv版本 windows 葫芦岛离大连多久啊,离沈阳呢,三个地方怎么走更科学,我在长春 辽宁盘锦离葫芦岛是多少公里? 中通快递从葫芦岛到长春需要多长时间? 宁波到长春的k336列车都经过哪些车站? 王子文真的好懂穿搭,小黑裙配长发优雅妩媚,这种风格你喜欢吗? 王子文长发好看吗? 王子文真的好懂穿搭,小黑裙配长发优雅妩媚,你喜欢她的这种穿搭吗? X240 如何连接wifi 王子文留长发撞脸舒畅,究竟是谁更胜一筹? 联想think pad x240s如何打开wifi 怎么申请 注册 王子文长发亮相《快乐大本营》,30岁的她为何让网友赞誉“逆生长”?