在Objective-C中使用OpenCV(含源码)

      申明:本博文内容来自于互联网,如因本文内容而发生的一切纠纷,均与本文章的翻译者无关。翻译质量因本人水平,有所限制。欢迎批评指正。本文章仅供参考、学习、交流之用,禁止用于任何商业用途。转载时请保留原文出处与保留本申明,多谢合作

      原文出处:http://computer-vision-talks.com/2011/01/using-opencv-in-objective-c-code/    

      在写完了为IOS生成OpenCV后,有些读都向我问起了如何在fObjctive-C中使用OpenCV,因为他们在编译时遇到了报错。在这篇博文里,我我向各位讲解如何使用OpenCV和Objective-C来做一些图片处理。

    在本文里,我会使用GLImageProcessing示例,它来自于苹果官网。当然,你还是要为iPhone先预编译一下OpenCV。至于怎么做,请参考这里。

    我复制了所有的OpenCV资源到 GLImageProcessing工程中的opencv”文件,以下是工程目录的结构:

example-directory-structure.jpg

现在,让我们把OpenCV加入到我们的工程里去。

第一步 指定OpenCV 的头文件存放目录,添加OpenCV的头文件的路径,到Search Paths”属性

opencv-include-headers.jpg

第二步- 设置OpenCV库的路径. 请注意: 在每一次配置中,你都要重复这样的工作 (debug/release, device/simulator) 因为OpenCV库目录结构的问题。添加OpenCV库到“Library Search Paths” 属性(如果是真机的发布(release)版本,那么就应该是 “opencv/lib/iphoneos/Release” (如果你按照我的目录结构来生成的话).

第三步: 定义生成的可执行文件链接要包含OpenCV:

opencv-link-libraries.jpg

        正如你所看到的,我更喜欢使用连接标志,而不是Xcode 的UI(Targets -> GLImageProcessing -> Link Binary With Libraries -> Add -> Existing Files…)。有以下几个原因:使用这样的方法是因为我并不信任Xcode(实际上是因我的所有项目都要使用交叉编译,这样做这话为让我做起来更简单,这是我另外一篇文章要说的)。

      现在,添加#include <opencv2/opencv.hpp>到头文件中,在 加入#include <OpenGLES/ES1/glext.h>之后,我添加这个include到Imaging.h的文件中。再点击“Build and Run”后,……悲剧,编译错误。让我们来看一下,要如何来解决这些错误。首先,修改所有的.m 的包含了OpenCV的扩展文件为.mm.这将为编译器声明这些文件都是Objective-C++代码。同时也修改所有的.c文件为.cpp,因为OpenCV使用了STL,这是C语言没有的,所以你看到了编译错误的提示。

  现在只有以下一个错误了:

opencv/include/opencv2/core/core.hpp:432: error: statement-expressions are allowed only inside functions

opencv/include/opencv2/core/core.hpp:432: confused by earlier errors, bailing out

这些错误是由于MIN符号的原因,是OpenCV的一个宏函数,它在UIKit或其它的frameworks中被定义。简单的解决方法是在IOS frameworksinclude 一个OpenCV.

好了,修改了这些以后,现在我们要使用OpenCV代码了,让我们来修改矩阵乘法的代码吧。

 Imaging.cpp里:

// Matrix Utilities for Hue rotation
static void matrixmult(float a[4][4], float b[4][4], float c[4][4])
{
int x, y;
float temp[4][4];
for(y=0; y&lt;4; y++)
for(x=0; x&lt;4; x++)
temp[y][x] = b[y][0] * a[0][x] +
b[y][1] * a[1][x] +
b[y][2] * a[2][x] +
b[y][3] * a[3][x];
for(y=0; y&lt;4; y++)
for(x=0; x&lt;4; x++)
c[y][x] = temp[y][x];
}

有点蹩脚的代码,对么?让我们重新写过吧:

// Matrix Utilities for Hue rotation
static void matrixmult(float a[4][4], float b[4][4], float c[4][4])
{
cv::Mat(4,4,CV_32FC1, c) = cv::Mat(4,4,CV_32FC1, a) * cv::Mat(4,4,CV_32FC1,b);
}

给各位一个小小的提醒,cv::Mat 是OpenCV的一种矩阵。我们可以用它初始化一个取值于一个float[4][4]数组的图。但是不能够复制它。它对两个矩阵(a和b)的乘法运算结果结果是一个c矩阵。

点击国"Build and Run",我们可以得到:

Screenshot-2011.01.12-11.11.45.png

这是一个很简单的示例,它向我们示范了如何完美地在Objective-C中使用OpenCV。

最后,祝你好运。

转载于:https://www.cnblogs.com/zeping/archive/2011/10/17/2215332.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值