iOS上mxnet的一个演示App

mxnet是最近火的不行的一个深度学习的框架,支持好多好多语言,有好多好多大牛在写。 之前也有想过把同样很牛很牛的caffe跑到iOS上看看速度怎么样,但是caffe有一大堆文件,感觉做起来很麻烦。 最近看到mxnet居然有一个单文件的版本! 就做了一个简单的图像识别的演示App。跑在6上速度还可以,大概4秒一张图。 代码在这里: WhatsThis-iOS on Github

利用摄像头判断手机移动方向[MPMotionPattern]

这部分代码是做原型用的,现在已经不在项目里。 也没有什么特别的算法,所以就放在这里吧。 https://github.com/pppoe/MPMotionPattern 需要用到之前的“iOS逐帧处理录像-MPVideoProcessor”。 主要的算法是从TinyMotion这个项目来的,用到的也是他们的算法。 功能很简单,就是通过iPhone摄像头拍摄的图像,判断手机当前的移动方向。 现在也只是支持上下左右。因为iPhone本身就有传感器可以取到这种动作,所以用图像似乎也没有什么特别的优势… 只是感觉挺好玩的。XD

iOS逐帧处理录像-MPVideoProcessor

一般在iOS上做录像都可以直接使用UIImagePickerController。 但有时候难免需要做逐帧的处理,比如实时的滤镜之类的。 参照这个帖子: A (quasi-) real-time video processing on iOS 把使用AVFoundation做录像的代码,做了一个简单的封装。 Delegate可以得到逐帧的彩色或者灰度图,然后就可以加上自己需要的处理了。 代码放在Gihub上:MPVideoProcessor 具体使用请参见Github上的Readme.

[iOS]How to save and load a custom object?

Here we go. How to write a custom object which can be archived to a text file? Usually, we use NSKeyedArchiver to serialize an object and write it to a file. Correspondingly, NSKeyedUnarchiver is used to get the object from the file. The NSKeyedArchiver’s interface is like this: + (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path; NSKeyedArchiver is a […]

[iOS]delegate和protocol

今天上班和同事讨论工程怎么组织的时候涉及到这个话题。 iOS开发上对delegate使用广泛。 记在这里,如果有新人Google到了,希望能有点帮助。 protocol和delegate完全不是一回事,放在一起说,只是因为我们经常在同一个头文件里看到这两个word。 protocol和java里interface的概念类似,是Objective-C语法的一部分。 定义protocol如下 @protocol ClassADelegate – (void)methodA; – (void)methodB; @end 那么就是定义了一组函数,这组函数放在一起叫作一个protocol,也就是协议。 函数是需要被实现的,所以如果对于class如下 @interface ClassB { } @end 就叫作ClassB conform to protocol ClassADelegate,也就是说ClassB实现了这个协议, 也就是实现了这一组函数。 有了上面这个头文件,我们就可以放心作调用 ClassB *b = [[ClassB alloc] init]; [b methodA]; [b methodB]; 而不用担心出现unrecognized selector sent to instance这种错误了。 所以protocol就是一组函数定义,是从类声明中剥离出来的一组定义。 id b = …; [b methodA]; 这种用法也常见,b是一个id类型,它知道ClassADelegate这组函数的实现。 那么delegate是什么?其实和protocol没有关系。Delegate本身应该称为一种设计模式。 是把一个类自己需要做的一部分事情,让另一个类(也可以就是自己本身)来完成。 比如ClassC @interface ClassC […]

贝塞尔曲线拟合

接上一篇Blog,这里用贝塞尔曲线来平滑多个点。 和样条插值不同,在多个点上作贝塞尔曲线的时候,曲线只穿过首尾两个点,中间的点都是作为控制点。 移动控制点,曲线也随之形变,可以造成一种拉扯的效果。在各种作图工具中,经常使用贝塞尔曲线来画曲线。一般的操作都是先画一条线段,然后可以通过拖动一个控制点来调整线段的弯曲程度。 作多点贝塞尔曲线只需要一个公式。所有的点的X值,被归一化到[0,1]区间内。 具体理论,可以参考这个页面Bézier curves。89年创建的,可有年头了。 这里还是贴代码吧。 首先需要得到X区间的总长度。 CGPoint startPt = [[_points objectAtIndex:0] CGPointValue]; CGPoint endPt = [[_points objectAtIndex:(self.pointCount – 1)] CGPointValue]; float amount = endPt.x – startPt.x; 然后就是曲线方程了,这个比样条插值要简单不少。 rank是指总的阶数,也就是实际的点数。这个函数表示n个点的贝塞尔曲线在x处的值。 这里的ux属于区间[0,1] float (^bezierSpline)(int rank, float ux) = ^(int rank, float ux) { float p = 0.0f; for (int i = 0; i < rank; i++) […]