ios 如何用openCV提取图片特征?

有没有在 ios上用openCV提取图片特征的?最近想做这方面的东西。 领导希望我在手机端相机扫描 然后 每隔一段时间把扫描的图片的特征发给服务器。然后服务器用来AR识别。但是现在图片的特征不知道如何提取。

导入 OpenCV 到 Xcode 的工程中还是比较简单的,从官网下载对应的 framework,直接丢到 Xcode 的工程中,然后在你想用 OpenCV 的地方引入 OpenCV 的头文件:

#import
或者直接在 PCH 文件中添加:

#ifdef __cplusplus
#import
#endif

https://www.jianshu.com/p/79f9c4200b9e

导入 OpenCV 到 Xcode 的工程中还是比较简单的,从官网下载对应的 framework,直接丢到 Xcode 的工程中,然后在你想用 OpenCV 的地方引入 OpenCV 的头文件:

#import
或者直接在 PCH 文件中添加:

#ifdef __cplusplus
#import
#endif

我是想问 在iOS里具体用OpenCV 怎么提取图片特征,而不是问如何把OpenCV导入到iOS项目里。OpenCV我已经导入到项目里了,就是想问问有没有人具体做过 提取图片特征的 这个功能。做过的话,是怎么做的?

#include "opencv2/opencv.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/nonfree/features2d.hpp"

#include "opencv2/flann/miniflann.hpp"

#include "opencv2/objdetect/objdetect.hpp"

#include "opencv2/calib3d/calib3d.hpp"

#include

#include

using namespace cv;

using namespace std;

cv::Mat flannMatchExtract(cv::Mat srcImage1, cv::Mat srcImage2)

{

CV_Assert(srcImage1.data != 0 && srcImage2.data != 0);

// 构造SURF检测器

int hessPara = 300;

SurfFeatureDetector detector(hessPara);

vector kPoint1, kPoint2;

// 特征点检测

detector.detect(srcImage1,kPoint1);

detector.detect(srcImage2,kPoint2);

SurfDescriptorExtractor extractor;

// 描述子提取

cv::Mat despMat1, despMat2;

extractor.compute(srcImage1,kPoint1, despMat1);

extractor.compute(srcImage2,kPoint2, despMat2);

// Flann 特征点匹配

FlannBasedMatcher matcher;

vector< DMatch > matches;

matcher.match( despMat1, despMat2, matches );

double max_dist = 0; double min_dist = 100;

// 距离判断-最优匹配点

for( int i = 0; i < despMat1.rows; i++ )

{

double dist = matches[i].distance;

if( dist < min_dist )

min_dist = dist;

if( dist > max_dist )

max_dist = dist;

}

printf("Max dist : %f \n", max_dist );

printf("Min dist : %f \n", min_dist );

// 最佳匹配点

vector< DMatch > matchVec;

// 检测点

for( int i = 0; i < despMat1.rows; i++ )

{

if( matches[i].distance < 3*min_dist )

{

matchVec.push_back( matches[i]);

}

}

// 绘制检测点

cv::Mat matchMat, matchMat2;

drawMatches( srcImage1, kPoint1, srcImage2, kPoint2,

matchVec, matchMat, Scalar::all(-1),

Scalar::all(-1),vector(),

DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );

imshow( "matchMat", matchMat);

// 特征点一致性检测

vector obj;

vector scene;

for( int i = 0; i < matchVec.size(); i++ )

{

obj.push_back( kPoint1[ matchVec[i].queryIdx ].pt );

scene.push_back( kPoint2[ matchVec[i].trainIdx ].pt );

}

// 随机一致性

Mat H = findHomography( obj, scene, CV_RANSAC );

// 构造变换矩阵

Point2f objCorner[4] = { cvPoint(0,0),

cvPoint( srcImage1.cols, 0 ),

cvPoint( srcImage1.cols, srcImage1.rows ),

cvPoint( 0, srcImage1.rows )

};

// 绘制匹配点

cv::Point sceneCors[4];

for( int i = 0; i < 4; i++ )

{

double x = objCorner[i].x;

double y = objCorner[i].y;

// 映射矩阵构造

double Z = 1./( H.at(2,0)*x +

H.at(2,1)*y + H.at(2,2) );

double X = ( H.at(0,0)*x +

H.at(0,1)*y + H.at(0,2) )*Z;

double Y = ( H.at(1,0)*x +

H.at(1,1)*y + H.at(1,2) )*Z;

sceneCors[i] = cvPoint( cvRound(X) +

srcImage1.cols, cvRound(Y) );

}

// 绘制匹配出目标

line( matchMat, sceneCors[0],

sceneCors[1], Scalar(0, 255, 0), 2 );

line( matchMat, sceneCors[1],

sceneCors[2], Scalar( 0, 255, 0), 2 );

line( matchMat, sceneCors[2],

sceneCors[3], Scalar( 0, 255, 0), 2 );

line( matchMat, sceneCors[3],

sceneCors[0], Scalar( 0, 255, 0), 2 );

imshow( "ObjectMat", matchMat );

return matchMat;

}

int main()

{

cv::Mat srcImage1 =

imread("hand1.jpg");

cv::Mat srcImage2 =

imread("hand2.jpg");

if (!srcImage1.data || !srcImage2.data)

return -1;

cv::Mat resMatchMat = flannMatchExtract(srcImage1, srcImage2);

cv::waitKey(0);

return 0;

用surf,sift试试