干货|基于特征的图像配准用于缺陷检测

OpenCV学堂 2024-06-26 23:26


点击上方蓝字关注我们

微信公众号:OpenCV学堂

投稿作者:小黄弟

来自:中国电科智慧城市建模仿真与智能技术重点实验室

文字编辑:gloomyfish

特征提取

基于特征的图像配准,具有非常广泛的应用,大致流程可以如下:

经典的特征匹配算法有SIFT、SURF、ORB等,这三种方法在OpenCV里面都已实现。SURF基本就是SIFT的全面升级版,有 SURF基本就不用考虑SIFT,而ORB的强点在于计算时间,以下具体比较:

计算速度:ORB>>SURF>>SIFT(各差一个量级)
旋转鲁棒性:SURF>ORB~SIFT(~表示差不多)
模糊鲁棒性:SURF>ORB~SIFT
尺度变换鲁棒性:SURF>SIFT>ORB(ORB并不具备尺度变换性)

所以结论就是,如果对计算实时性要求非常高,可选用ORB算法,但基本要保证正对拍摄;如果对稳定性要求稍高,可以选择SURF;基本不用SIFT。此外补充一点,自从OpenCV3.x开始,受到SIFT跟SURF专利授权的影响,OpenCV正式的发布版本中已经移除了SIFT跟SURF算法。ORB特征提取算法是基于FAST跟BRIEF算法改进的组合算法,其中FAST实现关键点/特征点的检测,在此基础上基于几何矩添加方向属性,BRIEF实现描述子生成,添加旋转不变性支持。


ORB特征匹配速度快的一个原因之一就是使用字符串向量的描述子,避免了浮点数计算。字符串描述子匹配上可以采用汉明距离或者LSH改进算法实现,相比浮点数计算L2距离进一步降低了计算量。所以在一般情况下建议使用ORB特征匹配,如果效果不好再尝试AKAZE/SURF/SIFT等其它特征匹配算法。

特征对齐/配准

两幅图像之间的基于特征匹配的透视变换矩阵求解通常被称为图像对齐或者配准。基于特征的匹配可以很好实现图像对齐或者配准,首先需要获取两张图像的特征关键点与特征描述子,然后通过暴力匹配或者FLANN匹配寻找匹配度高的相关特征点。最后基于这些相关特征点估算它们之间的单应性矩阵,通过单应性矩阵实现透视变换,完成图像对齐与配准。OpenCV中有两个函数可以获得单映射变换矩阵,分别为:

- findHomography- getPerspectiveTransform

两者之间的区别在于getPerspectiveTransform只会拿4个点去计算,findHomography则会拿一堆点(>=4)去计算。

应用代码演示

下面是一个简单的代码演示,基于特征对齐,实现基于分差的缺陷检测。

用基于ORB特征的匹配结果,如下图所示,可以看到有一些错误的匹配点


基于ORB特征实现图像相关特征点匹配的代码实现如下:

constint MAX_FEATURES = 5000;
constfloat GOOD_MATCH_PERCENT = 0.45f;
//im1为待配准图片
//im2为模板图片
//im1Reg为配准后的图片
//h为单应性矩阵
void alignImages(Mat&im1, Mat&im2, Mat&im1Reg, Mat&h)
{
    // 将图像转为灰度图
    Mat im1Gray, im2Gray;
    cvtColor(im1, im1Gray, COLOR_BGR2GRAY);
    cvtColor(im2, im2Gray, COLOR_BGR2GRAY);

    // 存储特征与特征描述子的变量
    std::vector keypoints1, keypoints2;
    Mat descriptors1, descriptors2;

    // 检测ORB特征计算特征描述子.
    Ptr orb = ORB::create(MAX_FEATURES);
    orb->detectAndCompute(im1Gray, Mat(), keypoints1, descriptors1);
    clock_t start, end;
    start = clock();
    orb->detectAndCompute(im2Gray, Mat(), keypoints2, descriptors2);  //77ms

    // 特征匹配.
    std::vector matches;
    Ptr matcher = DescriptorMatcher::create("BruteForce-Hamming");
    matcher->match(descriptors1, descriptors2, matches, Mat());
    // Sort matches by score
    std::sort(matches.begin(), matches.end());

    //基于GMS的特征匹配算法
    //vector matchesAll, matchesGMS;
    //BFMatcher matcher(NORM_HAMMING);
    //std::vector matches;
    //matcher.match(descriptors1, descriptors2, matchesAll);
    //cout << "matchesAll: " << matchesAll.size() << endl;
    //matchGMS(im1.size(), im2.size(), keypoints1, keypoints2, matchesAll, matches);
    //std::sort(matches.begin(), matches.end());

    end = clock();
    cout << (float)(end - start) * 1000 / CLOCKS_PER_SEC<<"ms"<< endl;

    // 移除不好的匹配点
    constint numGoodMatches = matches.size() * GOOD_MATCH_PERCENT;
    matches.erase(matches.begin() + numGoodMatches, matches.end());
    // 画匹配点
    Mat imMatches;
    drawMatches(im1, keypoints1, im2, keypoints2, matches, imMatches);
    imwrite("matches.jpg", imMatches);

    // 存储好的匹配点
    std::vector points1, points2;

    for (size_t i = 0; i < matches.size(); i++)
    {
        points1.push_back(keypoints1[matches[i].queryIdx].pt);
        points2.push_back(keypoints2[matches[i].trainIdx].pt);
    }

    // 找出最优单映射变换矩阵h
    h= findHomography(points1, points2, RANSAC);

    // 利用h矩阵进行透视变换
    warpPerspective(im1, im1Reg, h, im2.size());
}


Grid-based Motion Statistics(GMS)通过网格划分、运动统计特性的方法可以迅速剔除错误匹配,以此来提高匹配的稳定性。ORB+GMS的匹配效果如下,可见错误的匹配点少了很多。

配准后的图如下图所示:

将配准后的图与基准模板图做差分,效果如下:

进行形态学操作,

找出缺陷,比较大的缺陷可以找出来,较小的缺陷还是不能找出来。


这部分的代码实现如下:

int main(intargc, char **argv)
{
    // Read reference image
    string refFilename("8.jpg");
    cout <<"Reading reference image : "<< refFilename << endl;
    Mat imReference = imread(refFilename);

    // Read image to be aligned
    string imFilename("7.jpg");
    cout <<"Reading image to align : "<< imFilename << endl;
    Mat im = imread(imFilename);

    // Registered image will be resotred in imReg. 
    // The estimated homography will be stored in h. 
    Mat imReg, h;

    // Align images
    cout <<"Aligning images ..."<< endl;
    alignImages(im, imReference, imReg, h);

    // Write aligned image to disk. 
    string outFilename("aligned.jpg");
    cout <<"Saving aligned image : "<< outFilename << endl;
    imwrite(outFilename, imReg);

    // Print estimated homography
    cout <<"Estimated homography : \n"<< h << endl;
    Mat currentframe, previousframe;
    cvtColor(imReference, previousframe, COLOR_BGR2GRAY);
    cvtColor(imReg, currentframe, COLOR_BGR2GRAY);  //转化为单通道灰度图

    absdiff(currentframe, previousframe, currentframe);//做差求绝对值
    imshow("1", currentframe);
    imwrite("re.jpg", currentframe);
    threshold(currentframe, currentframe, 120255.0, THRESH_BINARY);
    imwrite("re11.jpg", currentframe);

    erode(currentframe, currentframe, Mat());//腐蚀
    dilate(currentframe, currentframe, Mat());//膨胀
    dilate(currentframe, currentframe, Mat());//膨胀

    imshow("moving area", currentframe);    //显示图像

    vector<vector> v;
    vector hierarchy;
    Mat result;
    Rect rect;
    findContours(currentframe, v, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_NONE);
    for (int i = 0; i < hierarchy.size(); i++)
    {
        rect = boundingRect(v.at(i));
        if (rect.area() > 1)
        {
            rectangle(imReg, rect, Scalar(00255), 2);
        }
    }

    imwrite("res1.jpg", imReg);
    imshow("moving area1", imReg);
    waitKey(0);
}

关于特征检测跟提取,基于特征的对齐、全景拼接、图像配准等相关知识还可以阅读下面的相关链接获取更多知识。


志合者不以山海为远

道乖者不以咫尺为近


OpenCV4系统化学习


深度学习系统化学习

推荐阅读

OpenCV4.8+YOLOv8对象检测C++推理演示

ZXING+OpenCV打造开源条码检测应用

攻略 | 学习深度学习只需要三个月的好方法

三行代码实现 TensorRT8.6 C++ 深度学习模型部署

实战 | YOLOv8+OpenCV 实现DM码定位检测与解析

对象检测边界框损失 – 从IOU到ProbIOU

初学者必看 | 学习深度学习的五个误区


OpenCV学堂 专注计算机视觉开发技术分享,技术框架使用,包括OpenCV,Tensorflow,Pytorch教程与案例,相关算法详解,最新CV方向论文,硬核代码干货与代码案例详解!作者在CV工程化方面深度耕耘15年,感谢您的关注!
评论 (0)
  • 在CAN总线分析软件领域,当CANoe不再是唯一选择时,虹科PCAN-Explorer 6软件成为了一个有竞争力的解决方案。在现代工业控制和汽车领域,CAN总线分析软件的重要性不言而喻。随着技术的进步和市场需求的多样化,单一的解决方案已无法满足所有用户的需求。正是在这样的背景下,虹科PCAN-Explorer 6软件以其独特的模块化设计和灵活的功能扩展,为CAN总线分析领域带来了新的选择和可能性。本文将深入探讨虹科PCAN-Explorer 6软件如何以其创新的模块化插件策略,提供定制化的功能选
    虹科汽车智能互联 2025-04-28 16:00 203浏览
  • 文/Leon编辑/cc孙聪颖‍2023年,厨电行业在相对平稳的市场环境中迎来温和复苏,看似为行业增长积蓄势能。带着对市场向好的预期,2024 年初,老板电器副董事长兼总经理任富佳为企业定下双位数增长目标。然而现实与预期相悖,过去一年,这家老牌厨电企业不仅未能达成业绩目标,曾提出的“三年再造一个老板电器”愿景,也因市场下行压力面临落空风险。作为“企二代”管理者,任富佳在掌舵企业穿越市场周期的过程中,正面临着前所未有的挑战。4月29日,老板电器(002508.SZ)发布了2024年年度报告及2025
    华尔街科技眼 2025-04-30 12:40 235浏览
  • 浪潮之上:智能时代的觉醒    近日参加了一场课题的答辩,这是医疗人工智能揭榜挂帅的国家项目的地区考场,参与者众多,围绕着医疗健康的主题,八仙过海各显神通,百花齐放。   中国大地正在发生着激动人心的场景:深圳前海深港人工智能算力中心高速运转的液冷服务器,武汉马路上自动驾驶出租车穿行的智慧道路,机器人参与北京的马拉松竞赛。从中央到地方,人工智能相关政策和消息如雨后春笋般不断出台,数字中国的建设图景正在智能浪潮中徐徐展开,战略布局如同围棋
    广州铁金刚 2025-04-30 15:24 230浏览
  • 贞光科技代理品牌紫光国芯的车规级LPDDR4内存正成为智能驾驶舱的核心选择。在汽车电子国产化浪潮中,其产品以宽温域稳定工作能力、优异电磁兼容性和超长使用寿命赢得市场认可。紫光国芯不仅确保供应链安全可控,还提供专业本地技术支持。面向未来,紫光国芯正研发LPDDR5车规级产品,将以更高带宽、更低功耗支持汽车智能化发展。随着智能网联汽车的迅猛发展,智能驾驶舱作为人机交互的核心载体,对处理器和存储器的性能与可靠性提出了更高要求。在汽车电子国产化浪潮中,贞光科技代理品牌紫光国芯的车规级LPDDR4内存凭借
    贞光科技 2025-04-28 16:52 282浏览
  • 网约车,真的“饱和”了?近日,网约车市场的 “饱和” 话题再度引发热议。多地陆续发布网约车风险预警,提醒从业者谨慎入局,这背后究竟隐藏着怎样的市场现状呢?从数据来看,网约车市场的“过剩”现象已愈发明显。以东莞为例,截至2024年12月底,全市网约车数量超过5.77万辆,考取网约车驾驶员证的人数更是超过13.48万人。随着司机数量的不断攀升,订单量却未能同步增长,导致单车日均接单量和营收双双下降。2024年下半年,东莞网约出租车单车日均订单量约10.5单,而单车日均营收也不容乐
    用户1742991715177 2025-04-29 18:28 236浏览
  • 一、gao效冷却与控温机制‌1、‌冷媒流动设计‌采用低压液氮(或液氦)通过毛细管路导入蒸发器,蒸汽喷射至样品腔实现快速冷却,冷却效率高(室温至80K约20分钟,至4.2K约30分钟)。通过控温仪动态调节蒸发器加热功率,结合温度传感器(如PT100铂电阻或Cernox磁场不敏感传感器),实现±0.01K的高精度温度稳定性。2、‌宽温区覆盖与扩展性‌标准温区为80K-325K,通过降压选件可将下限延伸至65K(液氮模式)或4K(液氦模式)。可选配475K高温模块,满足材料在ji端温度下的性能测试需求
    锦正茂科技 2025-04-30 13:08 291浏览
  • 随着电子元器件的快速发展,导致各种常见的贴片电阻元器件也越来越小,给我们分辨也就变得越来越难,下面就由smt贴片加工厂_安徽英特丽就来告诉大家如何分辨的SMT贴片元器件。先来看看贴片电感和贴片电容的区分:(1)看颜色(黑色)——一般黑色都是贴片电感。贴片电容只有勇于精密设备中的贴片钽电容才是黑色的,其他普通贴片电容基本都不是黑色的。(2)看型号标码——贴片电感以L开头,贴片电容以C开头。从外形是圆形初步判断应为电感,测量两端电阻为零点几欧,则为电感。(3)检测——贴片电感一般阻值小,更没有“充放
    贴片加工小安 2025-04-29 14:59 255浏览
  • 在智能硬件设备趋向微型化的背景下,语音芯片方案厂商针对小体积设备开发了多款超小型语音芯片方案,其中WTV系列和WT2003H系列凭借其QFN封装设计、高性能与高集成度,成为微型设备语音方案的理想选择。以下从封装特性、功能优势及典型应用场景三个方面进行详细介绍。一、超小体积封装:QFN技术的核心优势WTV系列与WT2003H系列均提供QFN封装(如QFN32,尺寸为4×4mm),这种封装形式具有以下特点:体积紧凑:QFN封装通过减少引脚间距和优化内部结构,显著缩小芯片体积,适用于智能门铃、穿戴设备
    广州唯创电子 2025-04-30 09:02 279浏览
  • 你是不是也有在公共场合被偷看手机或笔电的经验呢?科技时代下,不少现代人的各式机密数据都在手机、平板或是笔电等可携式的3C产品上处理,若是经常性地需要在公共场合使用,不管是工作上的机密文件,或是重要的个人信息等,民众都有防窃防盗意识,为了避免他人窥探内容,都会选择使用「防窥保护贴片」,以防止数据外泄。现今市面上「防窥保护贴」、「防窥片」、「屏幕防窥膜」等产品就是这种目的下产物 (以下简称防窥片)!防窥片功能与常见问题解析首先,防窥片最主要的功能就是用来防止他人窥视屏幕上的隐私信息,它是利用百叶窗的
    百佳泰测试实验室 2025-04-30 13:28 382浏览
  • 文/郭楚妤编辑/cc孙聪颖‍越来越多的企业开始蚕食动力电池市场,行业“去宁王化”态势逐渐明显。随着这种趋势的加强,打开新的市场对于宁德时代而言至关重要。“我们不希望被定义为电池的制造者,而是希望把自己称作新能源产业的开拓者。”4月21日,在宁德时代举行的“超级科技日”发布会上,宁德时代掌门人曾毓群如是说。随着宁德时代核心新品骁遥双核电池的发布,其搭载的“电电增程”技术也走进业界视野。除此之外,经过近3年试水,宁德时代在换电业务上重资加码。曾毓群认为换电是一个重资产、高投入、长周期的产业,涉及的利
    华尔街科技眼 2025-04-28 21:55 181浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦