【第二部分 图像处理】第3章 Opencv图像处理进阶【6角点检测 B】

2024-08-30 13:32

本文主要是介绍【第二部分 图像处理】第3章 Opencv图像处理进阶【6角点检测 B】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

6.2 Shi-Tomasi角点检测

6.2.1 Shi-Tomasi角点检测概述及原理

Shi-Tomasi 算法是Harris 算法的改进。Harris 算法最原始的定义是将矩阵 M 的行列式值与 M 的迹相减,再将差值同预先给定的阈值进行比较。后来Shi 和Tomasi 提出改进的方法,若两个特征值中较小的一个大于最小阈值,则会得到强角点。
参考论文:hi and C. Tomasi. Good Features to Track. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pages 593-600, June 1994.(见笔者附件)

6.2.2 Shi-Tomasi角点检测:goodFeaturesToTrack()函数

 goodFeaturesToTrack()函数讲解

C++: void goodFeaturesToTrack( InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask=noArray(), int blockSize=3, bool useHarrisDetector=false, double k=0.04 )

【参数】
第一个参数,image – Input 8-bit or floating-point 32-bit, single-channel image.
第二个参数,eigImage – The parameter is ignored.
第三个参数,tempImage – The parameter is ignored.
第四个参数,corners – Output vector of detected corners.
第五个参数,maxCorners – Maximum number of corners to return. If there are more corners than are found, the strongest of them is returned.
第六个参数,qualityLevel – Parameter characterizing the minimal accepted quality of image corners. The parameter value is multiplied by the best corner quality measure, which is the minimal eigenvalue (see cornerMinEigenVal() ) or the Harris function response (see cornerHarris() ). The corners with the quality measure less than the product are rejected. For example, if the best corner has the quality measure = 1500, and the qualityLevel=0.01 , then all the corners with the quality measure less than 15 are rejected.
第七个参数,minDistance – Minimum possible Euclidean distance between the returned corners.
mask – Optional region of interest. If the image is not empty (it needs to have the type CV_8UC1 and the same size as image ), it specifies the region in which the corners are detected.
第八个参数,blockSize – Size of an average block for computing a derivative covariation matrix over each pixel neighborhood. See cornerEigenValsAndVecs() .
useHarrisDetector – Parameter indicating whether to use a Harris detector (see cornerHarris()) or cornerMinEigenVal().
第九参数,k – Free parameter of the Harris detector.
 goodFeaturesToTrack()函数源代码

/*【goodFeaturesToTrack ( )源代码】***************************************************** @Version:OpenCV 3.0.0(Opnencv2和Opnencv3差别不大,Linux和PC的对应版本源码完全一样,均在对应的安装目录下)  * @源码路径:…\opencv\sources\modules\imgproc\src\ featureselect.cpp* @起始行数:265行   
********************************************************************************/
void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners,int maxCorners, double qualityLevel, double minDistance,InputArray _mask, int blockSize,bool useHarrisDetector, double harrisK )
{CV_Assert( qualityLevel > 0 && minDistance >= 0 && maxCorners >= 0 );CV_Assert( _mask.empty() || (_mask.type() == CV_8UC1 && _mask.sameSize(_image)) );CV_OCL_RUN(_image.dims() <= 2 && _image.isUMat(),ocl_goodFeaturesToTrack(_image, _corners, maxCorners, qualityLevel, minDistance,_mask, blockSize, useHarrisDetector, harrisK))Mat image = _image.getMat(), eig, tmp;if (image.empty()){_corners.release();return;}if( useHarrisDetector )cornerHarris( image, eig, blockSize, 3, harrisK );elsecornerMinEigenVal( image, eig, blockSize, 3 );double maxVal = 0;minMaxLoc( eig, 0, &maxVal, 0, 0, _mask );threshold( eig, eig, maxVal*qualityLevel, 0, THRESH_TOZERO );dilate( eig, tmp, Mat());Size imgsize = image.size();std::vector<const float*> tmpCorners;// collect list of pointers to features - put them into temporary imageMat mask = _mask.getMat();for( int y = 1; y < imgsize.height - 1; y++ ){const float* eig_data = (const float*)eig.ptr(y);const float* tmp_data = (const float*)tmp.ptr(y);const uchar* mask_data = mask.data ? mask.ptr(y) : 0;for( int x = 1; x < imgsize.width - 1; x++ ){float val = eig_data[x];if( val != 0 && val == tmp_data[x] && (!mask_data || mask_data[x]) )tmpCorners.push_back(eig_data + x);}}std::sort( tmpCorners.begin(), tmpCorners.end(), greaterThanPtr() );std::vector<Point2f> corners;size_t i, j, total = tmpCorners.size(), ncorners = 0;if (minDistance >= 1){// Partition the image into larger gridsint w = image.cols;int h = image.rows;const int cell_size = cvRound(minDistance);const int grid_width = (w + cell_size - 1) / cell_size;const int grid_height = (h + cell_size - 1) / cell_size;std::vector<std::vector<Point2f> > grid(grid_width*grid_height);minDistance *= minDistance;for( i = 0; i < total; i++ ){int ofs = (int)((const uchar*)tmpCorners[i] - eig.ptr());int y = (int)(ofs / eig.step);int x = (int)((ofs - y*eig.step)/sizeof(float));bool good = true;int x_cell = x / cell_size;int y_cell = y / cell_size;int x1 = x_cell - 1;int y1 = y_cell - 1;int x2 = x_cell + 1;int y2 = y_cell + 1;// boundary checkx1 = std::max(0, x1);y1 = std::max(0, y1);x2 = std::min(grid_width-1, x2);y2 = std::min(grid_height-1, y2);for( int yy = y1; yy <= y2; yy++ )for( int xx = x1; xx <= x2; xx++ ){std::vector <Point2f> &m = grid[yy*grid_width + xx];if( m.size() ){for(j = 0; j < m.size(); j++){float dx = x - m[j].x;float dy = y - m[j].y;if( dx*dx + dy*dy < minDistance ){good = false;goto break_out;}}}}break_out:if (good){grid[y_cell*grid_width + x_cell].push_back(Point2f((float)x, (float)y));corners.push_back(Point2f((float)x, (float)y));++ncorners;if( maxCorners > 0 && (int)ncorners == maxCorners )break;}}}else{for( i = 0; i < total; i++ ){int ofs = (int)((const uchar*)tmpCorners[i] - eig.ptr());int y = (int)(ofs / eig.step);int x = (int)((ofs - y*eig.step)/sizeof(float));corners.push_back(Point2f((float)x, (float)y));++ncorners;if( maxCorners > 0 && (int)ncorners == maxCorners )break;}}Mat(corners).convertTo(_corners, _corners.fixedType() ? _corners.type() : CV_32F);
}

6.2.3 Shi-Tomasi角点检测实例

代码参看附件【demo1】。

这里写图片描述

图1

这里写图片描述

图2

通过滑动滑动条可以改变角点数量。

参考:
中文
英文

本章参考附件

点击进入

这篇关于【第二部分 图像处理】第3章 Opencv图像处理进阶【6角点检测 B】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120954

相关文章

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X