iOS使用openVC实现图片对比
iOS使用openVC实现图片特征点提取与图片对比
openVC.framework可以去官网下载,这里我就不说怎么下载和导入的问题了,直接拉进项目就行了(推荐不要用pods导入,因为有3个地方会报错,需要改代码,至于咋改我忘记了,出问题的时候自己百度去),下面进入正题。
首先是导入头文件
#import <opencv2/opencv.hpp>
#import <opencv2/imgproc/types_c.h>
#import <opencv2/imgcodecs/ios.h>
下面是实现特征点提取与图片对比的方法
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<cv::KeyPoint> keypoints_1, keypoints_2;
cv::Mat descriptors_1, descriptors_2;
cv::Ptr<cv::FeatureDetector> detector = cv::ORB::create();
cv::Ptr<cv::DescriptorExtractor> 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<cv::DMatch> matches;
cv::BFMatcher bfMatcher(cv::NORM_HAMMING);
bfMatcher.match(descriptors_1, descriptors_2, matches);
std::cout<<"Find total "<<matches.size()<<"matches"<<std::endl;(这一句就是打印提取的特征点的数量,没啥实际作用)
6、筛选掉一些不符合的特征点,以下这个算法我是筛选掉了距离大于50的点,留下距离差距不大的点。这种一般的图片可以比较准确的匹配到2个图片的对应的特征点。
std::vector<cv::DMatch> 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 "<<good_matches.size()<<"matches"<<std::endl; (这一句是打印筛选过后的特征点数量,没啥实际作用)
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