Opencv in iOS 1:Testing Canny of Basic FrameWork
来源:互联网 发布:薛进文 饶子和 知乎 编辑:程序博客网 时间:2024/06/05 18:46
Opencv 是最通用的计算机视觉/图像视频处理库,对常见的算法都有很好的封装。在它的文档中我们可以看到,Opencv 只提供 C/C++ 和 Python 的 API。然则移动 App 以它的特有的便利正在逐渐取代 Desktop App 和 Web App,尤其camera 相关的 App 更是得到青睐。图像和视频相关的处理是 Opencv 的强项,如果能把它用在移动应用的开发上,那最好不过了。 幸运的是,Opencv 提供了对 iOS 和 Android 的支持,虽然不是直接支持 Objc 和 Java API。 Android 不太清楚,Objc 由于是可以与 C++混编的,因此直接调用 Opencv 的C++ API 即可。
iOS 中使用 OpenCV,特别需要注意的地方是 Cocoa(OBJC) 的 API 和 OpenCV(C++) 的 API 的关系。比如说图像,Cocoa 中是用 UIImage, 在 OpenCV 中用 Mat。
@interface ViewController : UIViewController <CvVideoCameraDelegate>@property (nonatomic, strong) CvVideoCamera* videoCamera;- (instancetype)initWithCameraView:(UIImageView *)view scale:(CGFloat)scale;- (void)startCapture;- (void)stopCapture;@end
关于 iOS 开发中使用 OpenCV,Google 出来的资料比较少,也比较旧,无法完全适用 Opencv、iOS、Xcode 这几年中产生的新版本;Apple 和 Opencv 都没有提供官方的文档或指南。(Google 一下 Android OpenCV 看看人家有多少资料)。结合我的配置和使用来谈一谈经验吧。
链接 OpenCV
1.与 VS 中使用 OpenCV 开发 C 程序前复杂的配置相比,这里简直 so easy. 去 OpenCV 官网 下载 OpenCV for iOS,解压出来是 opencv2.framework ,你看,它就是个框架,与 Foundation 之类的框架没啥区别。要想在工程中使用,一个方法是直接把上述文件拖进工程;另一个方法是在 Build Phases –> Link Binary with libraries 中加入。使用 OpenCV与平时使用 OpenCV 相似,只需要加入头文件即可使用。值得注意的是:在使用 OpenCV 函数的 m 文件,后缀改成 mm,告诉 Xcode 这里有 C++与 objc 的混合使用。
新的 Xcode(6)生成工程后并没有 pch 文件,所以无需按照其他教程说的在这里写 #ifdef __cplusplus … 。我们在使用 OpenCV 的文件,如上述的 mm 文件,也无需再写这个了。
有的教程说 opencv 的 import 要写在 UIKit, Foundation 这些系统自带的 framework 之前,否则会出现重命名的冲突。在新版中无需在意这个问题。而且版本一直在更新,有些细节会变化,比如 ios.h 原来是在另一个包中。(IN THE highgui LIB)
Demo code:http://blog.csdn.net/songrotek/article/details/407800732.
Canny > for one image
#import <opencv2/highgui/ios.h>#import <opencv2/highgui/cap_ios.h>#import "ViewController.h"#import <opencv2/opencv.hpp>#import <opencv2/imgproc/types_c.h>@interface ViewController () { cv::Mat cvImage; } @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; CGRect rect = [UIScreen mainScreen].bounds; self.imageView.frame = rect; UIImage *image = [UIImage imageNamed:@"road.JPG"]; // Convert UIImage * to cv::Mat UIImageToMat(image, cvImage); if (!cvImage.empty()) { cv::Mat gray; // Convert the image to grayscale; cv::cvtColor(cvImage, gray, CV_RGBA2GRAY); // Apply Gaussian filter to remove small edges cv::GaussianBlur(gray, gray, cv::Size(5,5), 1.2,1.2); // Calculate edges with Canny cv::Mat edges; cv::Canny(gray, edges, 0, 60); // Fill image with white color cvImage.setTo(cv::Scalar::all(255)); // Change color on edges cvImage.setTo(cv::Scalar(0,128,255,255),edges); // Convert cv::Mat to UIImage* and show the resulting image self.imageView.image = MatToUIImage(cvImage); } }
using canny camera
// // ViewController.m // OPENCV // // Created by MAC on 15/6/7. // Copyright (c) 2015年 MAC. All rights reserved. //#import "ViewController.h"#import <opencv2/highgui/ios.h>#import <opencv2/highgui/cap_ios.h>#import "ViewController.h"#import <opencv2/opencv.hpp> //#import <opencv2/imgcodecs/ios.h>#import <opencv2/imgproc/types_c.h> @interface ViewController () { cv::Mat cvImage; } @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; self.videoCamera = [[CvVideoCamera alloc] initWithParentView:self.imageView]; self.videoCamera.delegate = self; self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionBack; self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset640x480; self.videoCamera.defaultFPS = 20; } //- (void)startCapture { // [self.videoCamera start]; //}//- (instancetype)initWithCameraView:(UIImageView *)view scale:(CGFloat)scale { // self = [super init]; // if (self) { // self.videoCamera = [[CvVideoCamera alloc] initWithParentView:view]; // self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionBack; // self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset640x480; // self.videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait; // self.videoCamera.defaultFPS = 30; // self.videoCamera.grayscaleMode = NO; // self.videoCamera.delegate = self; // // self.scale = scale; // // self.videoCamera = [[CvVideoCamera alloc] initWithParentView:self.imageView]; // // self.videoCamera.delegate = self; // // self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionBack; // // self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset640x480; // // self.videoCamera.defaultFPS = 30; // // } // return self; //}- (void)processImage:(cv::Mat&)image { // Do some OpenCV stuff with the image cv::Mat gray; // Convert the image to grayscale; cv::cvtColor(image, gray, CV_RGBA2GRAY); // Apply Gaussian filter to remove small edges cv::GaussianBlur(gray, gray, cv::Size(5,5), 1.2,1.2); // Calculate edges with Canny cv::Mat edges; cv::Canny(gray, edges, 0, 16); // Fill image with white color image.setTo(cv::Scalar::all(255)); // Change color on edges image.setTo(cv::Scalar(0,128,255,255),edges); // Convert cv::Mat to UIImage* and show the resulting image self.imageView.image = MatToUIImage(image); }- (IBAction)Start:(id)sender { [self.videoCamera start]; }- (IBAction)Stop:(id)sender { [self.videoCamera stop];} @end
- 使用CocoaPod pod install(Link to git)
- Opencv in iOS 1:Testing Canny of Basic FrameWork
- Hit-Testing in iOS
- Basic OCR in OpenCV
- Basic OCR in OpenCV
- Basic OCR in OpenCV
- Basic Concepts of Microsoft .Net Framework
- opencv日常之Canny边缘检测 1
- Deep cognition of testing 1
- opencv-ios开发笔记6 利用canny简单提取轮廓
- Some basic details of template in C++
- the basic operation of sequence in python
- 【Basic computer】-----website testing
- Computer vision with iOS Part 1: Building an OpenCV framework
- Computer vision with iOS Part 1: Building an OpenCV framework
- python in or of opencv
- Testing the Type of a File in Unix
- Problem of testing SSH in git behind proxy
- OpenCV 的 canny掃描實驗
- 酷狗面试感想
- 如何从零开始开发一款嵌入式产品
- Codeforces551B:ZgukistringZ
- centos6.5 安装pomelo
- 第十六周项目3-max带来的冲突
- Opencv in iOS 1:Testing Canny of Basic FrameWork
- !!js中call、apply、bind的用法
- app如何混淆,打包,签名?
- centos6.x服务解释
- c#控件
- 鼠标滑动到当前页面触发动画效果
- 配置Eclipse支持java和xml文件的代码补全功能
- android 代码片段,实现60秒倒计时
- java反射 反射构造函数 报 wrong number of arguments 错误