iOS使用openVC实现图片对比

iOS使用openVC实现图片特征点提取与图片对比

openVC.framework可以去官网下载,这里我就不说怎么下载和导入的问题了,直接拉进项目就行了(推荐不要用pods导入,因为有3个地方会报错,需要改代码,至于咋改我忘记了,出问题的时候自己百度去),下面进入正题。

首先是导入头文件

#import

#import

#import

下面是实现特征点提取与图片对比的方法

1、读取需要处理的两幅RGBD图像

cv::Mat img_1,img_2;

UIImage *image1 = [UIImage imageNamed:@"7"]; 

UIImageToMat(image1, img_1);

UIImage *image2 = [UIImage imageNamed:@"8"];

UIImageToMat(image2, img_2);

2、初始化特征点提取方法

std::vector keypoints_1, keypoints_2;

cv::Mat descriptors_1, descriptors_2;

cv::Ptr detector = cv::ORB::create();

cv::Ptr descriptor = cv::ORB::create();

3、提取特征点

detector->detect (img_1,keypoints_1);

detector->detect (img_2,keypoints_2);

4、计算特征描述符

descriptor->compute (img_1, keypoints_1, descriptors_1);

descriptor->compute (img_2, keypoints_2, descriptors_2);

5、对两幅图像的BRIEF描述符进行匹配,使用BFMatch,Hamming距离作为参考

std::vector matches;

cv::BFMatcher bfMatcher(cv::NORM_HAMMING);

bfMatcher.match(descriptors_1, descriptors_2, matches);

std::cout<<"Find total "<

6、筛选掉一些不符合的特征点,以下这个算法我是筛选掉了距离大于50的点,留下距离差距不大的点。这种一般的图片可以比较准确的匹配到2个图片的对应的特征点。

std::vector good_matches;

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

    if (matches[i].distance <= 50)

        good_matches.push_back(matches[i]);

}

std::cout<<"Find total "<

7、经过我的测试,实现图片对比我感觉匹配的特征点大于100就可以算作相似的图片了。

if (good_matches.size() > 100) {

    NSLog(@"匹配成功");

}

8、下面的代码是把提取的特征点绘制到图片

cv::Mat img_match;

cv::Mat img_goodmatch;

drawMatches (img_1, keypoints_1, img_2, keypoints_2, matches, img_match); (绘制未筛选特征点的图片)

drawMatches (img_1, keypoints_1, img_2, keypoints_2, good_matches, img_goodmatch); (绘制筛选过特征点后的图片)

UIImage *image1 = MatToUIImage(img_match); 

UIImage *image2 = MatToUIImage(img_goodmatch);

顺带提一句,openVC是C语言,所以记得把UIViewController.m改成UIViewController.mm


下面是吐槽内容:

        鱿鱼公司要做一个图片对比的功能,然后呢就被推荐用openVC实现,然后呢我就去百度用openVC怎么实现图片特征点提取与对比,然后就是搜到的全部都是c语言的代码和安卓的代码,一个iOS的代码我都没看到。无奈只能去啃c语言的资料了,还好这个东西都是封装好的,使用起来也并不难,但是看不懂英文的我还是花了2天时间才搞定。想想,要是会英文多好,看说明文档就不会这么费力了,悔不当初啊~~泪崩.png

你可能感兴趣的:(iOS使用openVC实现图片对比)