热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

特征检测之特征提取(Detect)

特征检测之特征提取(Detect)DetectkeypointsinimageusingthetraditionalShi-Thomasidetecto

特征检测之特征提取(Detect)

在这里插入图片描述

// Detect keypoints in image using the traditional Shi-Thomasi detector
void detKeypointsShiTomasi(vector &keypoints, cv::Mat &img, bool bVis)
{// compute detector parameters based on image sizeint blockSize &#61; 4; // size of an average block for computing a derivative covariation matrix over each pixel neighborhooddouble maxOverlap &#61; 0.0; // max. permissible overlap between two features in %double minDistance &#61; (1.0 - maxOverlap) * blockSize;int maxCorners &#61; img.rows * img.cols / max(1.0, minDistance); // max. num. of keypointsdouble qualityLevel &#61; 0.01; // minimal accepted quality of image cornersdouble k &#61; 0.04;// Apply corner detectiondouble t &#61; (double)cv::getTickCount();vector corners;cv::goodFeaturesToTrack(img, corners, maxCorners, qualityLevel, minDistance, cv::Mat(), blockSize, false, k);// add corners to result vectorfor (auto it &#61; corners.begin(); it !&#61; corners.end(); &#43;&#43;it){cv::KeyPoint newKeyPoint;newKeyPoint.pt &#61; cv::Point2f((*it).x, (*it).y);newKeyPoint.size &#61; blockSize;keypoints.push_back(newKeyPoint);}t &#61; ((double)cv::getTickCount() - t) / cv::getTickFrequency();cout <<"Shi-Tomasi detection with n&#61;" <}//FAST, BRISK, ORB, AKAZE, SIFT
void detKeypointsModern(std::vector &keypoints, cv::Mat &img, std::string detectorType, bool bVis)
{string windowName;if (detectorType.compare("FAST") &#61;&#61; 0){int threshold &#61; 30;bool bNMS &#61; true;cv::FastFeatureDetector::DetectorType type &#61; cv::FastFeatureDetector::TYPE_9_16; // TYPE_9_16, TYPE_7_12, TYPE_5_8cv::Ptr detector &#61; cv::FastFeatureDetector::create(threshold, bNMS, type);double t &#61; (double)cv::getTickCount();detector->detect(img, keypoints);t &#61; ((double)cv::getTickCount() - t) / cv::getTickFrequency();cout <<"FAST detection with n&#61; " < detector &#61; cv::BRISK::create();double t &#61; (double)cv::getTickCount();detector->detect(img, keypoints);t &#61; ((double)cv::getTickCount() - t) / cv::getTickFrequency();cout <<"BRISK detection with n&#61; " < detector &#61; cv::ORB::create();double t &#61; (double)cv::getTickCount();detector->detect(img, keypoints);t &#61; ((double)cv::getTickCount() - t) / cv::getTickFrequency();cout <<"ORB detection with n&#61; " < detector &#61; cv::AKAZE::create();double t &#61; (double)cv::getTickCount();detector->detect(img, keypoints);t &#61; ((double)cv::getTickCount() - t) / cv::getTickFrequency();cout <<"AKAZE detection with n&#61; " < detector &#61; cv::xfeatures2d::SIFT::create();double t &#61; (double)cv::getTickCount();detector->detect(img, keypoints);t &#61; ((double)cv::getTickCount() - t) / cv::getTickFrequency();cout <<"SIFT detection with n&#61; " <}// Detect keypoints in image using the traditional Harris detector
void detKeypointsHarris(std::vector &keypoints, cv::Mat &img, bool bVis)
{// Detector parametersint blockSize &#61; 2; // for every pixel, a blockSize × blockSize neighborhood is consideredint apertureSize &#61; 3; // aperture parameter for Sobel operator (must be odd)int minResponse &#61; 100; // minimum value for a corner in the 8bit scaled response matrixdouble k &#61; 0.04; // Harris parameter (see equation for details)// Detect Harris corners and normalize outputdouble t &#61; (double)cv::getTickCount();cv::Mat dst, dst_norm, dst_norm_scaled;dst &#61; cv::Mat::zeros(img.size(), CV_32FC1);cv::cornerHarris(img, dst, blockSize, apertureSize, k, cv::BORDER_DEFAULT);cv::normalize(dst, dst_norm, 0, 255, cv::NORM_MINMAX, CV_32FC1, cv::Mat());cv::convertScaleAbs(dst_norm, dst_norm_scaled);double maxOverlap &#61; 0.0; // max. permissible overlap between two features in %, used during non-maxima suppressionfor (size_t j &#61; 0; j (j, i);if (response > minResponse){ // only store points above a thresholdcv::KeyPoint newKeyPoint;newKeyPoint.pt &#61; cv::Point2f(i, j);newKeyPoint.size &#61; 2 * apertureSize;newKeyPoint.response &#61; response;// perform non-maximum suppression (NMS) in local neighbourhood around new key pointbool bOverlap &#61; false;for (auto it &#61; keypoints.begin(); it !&#61; keypoints.end(); &#43;&#43;it){double kptOverlap &#61; cv::KeyPoint::overlap(newKeyPoint, *it);if (kptOverlap > maxOverlap){bOverlap &#61; true;if (newKeyPoint.response > (*it).response){ // if overlap is >t AND response is higher for new kpt*it &#61; newKeyPoint; // replace old key point with new onebreak; // quit loop over keypoints}}}if (!bOverlap){ // only add new key point if no overlap has been found in previous NMSkeypoints.push_back(newKeyPoint); // store new keypoint in dynamic list}}} // eof loop over cols} // eof loop over rowst &#61; ((double)cv::getTickCount() - t) / cv::getTickFrequency();cout <<"Harris detection with n&#61;" <


推荐阅读
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 在Python中,是否可以通过使用Tkinter或ttk库创建一个具有自动换行功能的多行标签,并使其宽度能够随着父容器的变化而动态调整?例如,在调整NotePad窗口宽度时,实现类似记事本的自动换行效果。这种功能在设计需要显示长文本的对话框时非常有用,确保文本内容能够完整且美观地展示。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 探索聚类分析中的K-Means与DBSCAN算法及其应用
    聚类分析是一种用于解决样本或特征分类问题的统计分析方法,也是数据挖掘领域的重要算法之一。本文主要探讨了K-Means和DBSCAN两种聚类算法的原理及其应用场景。K-Means算法通过迭代优化簇中心来实现数据点的划分,适用于球形分布的数据集;而DBSCAN算法则基于密度进行聚类,能够有效识别任意形状的簇,并且对噪声数据具有较好的鲁棒性。通过对这两种算法的对比分析,本文旨在为实际应用中选择合适的聚类方法提供参考。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • 求助高手调试程序,非常感谢您的支持!在编写C语言程序时遇到了一些问题,具体代码如下:```c#include #include #include #define MAX 50int t;```希望有经验的开发者能提供指导,帮助解决调试中的难题。感谢您的时间和帮助! ... [详细]
  • 在使用 `useSelector` 选择器时,发现分派操作后状态未能实时更新。这可能是由于 React 组件的渲染机制或 Redux 的状态管理问题导致的。建议检查 `useSelector` 的依赖项和 `dispatch` 的调用时机,确保状态变化能够正确触发组件重新渲染。此外,可以考虑使用 `useEffect` 钩子来监听状态变化,以确保及时更新。 ... [详细]
  • 如何使用和示例代码解析 org.semanticweb.owlapi.model.OWLSubPropertyChainOfAxiom.getPropertyChain() 方法 ... [详细]
  • 在探讨Fragment的使用时,FragmentTransaction是不可或缺的一部分。作为管理Fragment操作的核心类,FragmentTransaction提供了诸如显示、隐藏、添加和移除等方法,这些方法在实际开发中被广泛使用。本文将深入解析FragmentTransaction的源码实现机制,帮助开发者更好地理解和优化Fragment的管理。通过分析其内部工作原理,读者可以掌握如何高效地进行Fragment的动态管理和性能优化。 ... [详细]
  • 在Java编程中,为了提高代码的可读性和执行效率,建议优先使用局部变量来存储方法的返回值,而不是多次调用同一个方法。这样不仅可以减少方法调用的开销,还能避免潜在的性能问题。此外,使用局部变量还可以增强代码的可维护性和调试便利性。 ... [详细]
  • 利用Java开发功能完备的电话簿应用程序,支持添加、查询与删除操作
    本研究基于Java语言开发了一款功能全面的电话簿应用程序,实现了与数据库的高效连接。该应用不仅支持添加、查询和删除联系人信息,还具备输出最大和最小ID号的功能,并能够对用户输入的ID号进行有效性验证,确保数据的准确性和完整性。详细实现方法可参阅相关文档。 ... [详细]
  • 如何使用 net.sf.extjwnl.data.Word 类及其代码示例详解 ... [详细]
  • 本文深入探讨了 Android DrawingView 的优化技巧与实现方法,重点介绍了如何实现平滑绘制效果。通过支持常见的绘图工具和形状,以及图层变换功能,提升了用户体验。文章详细解析了绘制过程中的性能优化策略,包括减少重绘次数、使用硬件加速和优化内存管理等技术,为开发者提供了实用的参考。 ... [详细]
  • 如何在Spark数据排序过程中有效避免内存溢出(OOM)问题
    本文深入探讨了在使用Spark进行数据排序时如何有效预防内存溢出(OOM)问题。通过具体的代码示例,详细阐述了优化策略和技术手段,为读者在实际工作中遇到类似问题提供了宝贵的参考和指导。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
author-avatar
命运2502901041_350
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有