34 Opencv 自定义角点检测

文章目录

  • cornerEigenValsAndVecs
  • cornerMinEigenVal
  • 示例

cornerEigenValsAndVecs

void cornerEigenValsAndVecs(InputArray src,       --单通道输入8位或浮点图像OutputArray dst,    --输出图像,同源图像或CV_32FC(6)int blockSize,         --邻域大小值int apertureSize,    --Sobel算子当中的核大小int borderType=BORDER_DEFAULT --像素外插方法
)//对应于Harris

cornerMinEigenVal

void cornerMinEigenVal(InputArray src,     --单通道输入8位或浮点图像OutputArray dst,  --图像存储的最小特征值。类型为CV_32FC1int blockSize,       --邻域大小值int apertureSize=3,   --Sobel算子的参数int borderType=BORDER_DEFAULT  --像素外插方法
}//对应Shi-Tomasi

示例

#include <opencv2/opencv.hpp> // 包含OpenCV库的头文件
#include <iostream>           // 包含标准输入输出流库#include <math.h>             // 包含数学函数库
using namespace cv;           // 使用cv命名空间,以避免每次调用OpenCV函数时都要写cv::
using namespace std;          // 使用std命名空间,以便使用cout, cin等函数const char* harris_win = "Custom Harris Corners Detector"; // 定义Harris角点检测结果窗口名称
const char* shitomasi_win = "Custom Shi-Tomasi Corners Detector"; // 定义Shi-Tomasi角点检测结果窗口名称
Mat src, gray_src;            // 声明源图像和灰度图变量// Harris角点响应相关的矩阵及最大最小响应值
Mat harris_dst, harrisRspImg;
double harris_min_rsp;
double harris_max_rsp;// Shi-Tomasi角点响应相关的矩阵及最大最小响应值
Mat shiTomasiRsp;
double shitomasi_max_rsp;
double shitomasi_min_rsp;int sm_qualitylevel = 30;     // Shi-Tomasi质量级别初始值
int qualityLevel = 30;        // Harris质量级别初始值
int max_count = 100;          // 滑动条的最大值void CustomHarris_Demo(int, void*); // 声明Harris角点检测回调函数
void CustomShiTomasi_Demo(int, void*);// 声明Shi-Tomasi角点检测回调函数int main(int argc, char** argv) {src = imread("D:/vcprojects/images/home.jpg"); // 读取图片到src Mat对象中if (src.empty()) {                             // 检查是否成功加载图片printf("could not load image...\n");return -1;}namedWindow("input image", CV_WINDOW_AUTOSIZE); // 创建一个名为"input image"的窗口imshow("input image", src);                     // 在该窗口中显示原始图像cvtColor(src, gray_src, COLOR_BGR2GRAY);        // 将BGR格式的src转换为灰度图gray_src// 计算特征值(Harris角点)int blockSize = 3;      // 邻域大小int ksize = 3;          // Sobel算子的孔径参数double k = 0.04;        // Harris公式中的自由参数kharris_dst = Mat::zeros(src.size(), CV_32FC(6)); // 初始化用于存储特征值和向量的矩阵harrisRspImg = Mat::zeros(src.size(), CV_32FC1); // 初始化用于存储Harris响应值的矩阵cornerEigenValsAndVecs(gray_src, harris_dst, blockSize, ksize, 4); // 计算每个像素处的特征值和特征向量// 计算Harris响应值for (int row = 0; row < harris_dst.rows; row++) {for (int col = 0; col < harris_dst.cols; col++) {double lambda1 = harris_dst.at<Vec6f>(row, col)[0]; // 获取第一个特征值double lambda2 = harris_dst.at<Vec6f>(row, col)[1]; // 获取第二个特征值harrisRspImg.at<float>(row, col) = lambda1 * lambda2 - k * pow((lambda1 + lambda2), 2); // 计算Harris响应值}}minMaxLoc(harrisRspImg, &harris_min_rsp, &harris_max_rsp, 0, 0, Mat()); // 找到响应值中的最大最小值namedWindow(harris_win, CV_WINDOW_AUTOSIZE); // 创建一个用于显示Harris角点检测结果的窗口createTrackbar("Quality Value:", harris_win, &qualityLevel, max_count, CustomHarris_Demo); // 创建滑块以调整质量级别CustomHarris_Demo(0, 0); // 初始调用回调函数// 计算最小特征值(Shi-Tomasi角点)shiTomasiRsp = Mat::zeros(src.size(), CV_32FC1); // 初始化用于存储Shi-Tomasi响应值的矩阵cornerMinEigenVal(gray_src, shiTomasiRsp, blockSize, ksize, 4); // 计算每个像素处的最小特征值minMaxLoc(shiTomasiRsp, &shitomasi_min_rsp, &shitomasi_max_rsp, 0, 0, Mat()); // 找到响应值中的最大最小值namedWindow(shitomasi_win, CV_WINDOW_AUTOSIZE); // 创建一个用于显示Shi-Tomasi角点检测结果的窗口createTrackbar("Quality:", shitomasi_win, &sm_qualitylevel, max_count, CustomShiTomasi_Demo); // 创建滑块以调整质量级别CustomShiTomasi_Demo(0, 0); // 初始调用回调函数waitKey(0); // 等待按键事件return 0;
}// Harris角点检测回调函数:根据用户设定的质量级别绘制角点
void CustomHarris_Demo(int, void*) {if (qualityLevel < 10) { // 设定最低质量级别qualityLevel = 10;}Mat resultImg = src.clone(); // 复制原始图像用于绘制角点float t = harris_min_rsp + (((double)qualityLevel) / max_count) * (harris_max_rsp - harris_min_rsp); // 根据质量级别计算阈值for (int row = 0; row < src.rows; row++) {for (int col = 0; col < src.cols; col++) {float v = harrisRspImg.at<float>(row, col); // 获取当前像素的Harris响应值if (v > t) { // 如果响应值大于阈值,则认为是角点circle(resultImg, Point(col, row), 2, Scalar(0, 0, 255), 2, 8, 0); // 在图像上绘制红色圆圈标记角点}}}imshow(harris_win, resultImg); // 显示带有角点标记的图像
}// Shi-Tomasi角点检测回调函数:根据用户设定的质量级别绘制角点
void CustomShiTomasi_Demo(int, void*) {if (sm_qualitylevel < 20) { // 设定最低质量级别sm_qualitylevel = 20;}Mat resultImg = src.clone(); // 复制原始图像用于绘制角点float t = shitomasi_min_rsp + (((double)sm_qualitylevel) / max_count) * (shitomasi_max_rsp - shitomasi_min_rsp); // 根据质量级别计算阈值for (int row = 0; row < src.rows; row++) {for (int col = 0; col < src.cols; col++) {float v = shiTomasiRsp.at<float>(row, col); // 获取当前像素的Shi-Tomasi响应值if (v > t) { // 如果响应值大于阈值,则认为是角点circle(resultImg, Point(col, row), 2, Scalar(0, 0, 255), 2, 8, 0); // 在图像上绘制红色圆圈标记角点}}}imshow(shitomasi_win, resultImg); // 显示带有角点标记的图像
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/64737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能入门是先看西瓜书还是先看花书?

在人工智能入门时&#xff0c;关于先看《机器学习》&#xff08;西瓜书&#xff09;还是先看《深度学习》&#xff08;花书&#xff09;的问题&#xff0c;实际上取决于个人的学习目标和背景。 《机器学习》&#xff08;西瓜书&#xff09;由周志华教授撰写&#xff0c;是一本…

B 站数据库负责人赵月顺:助力海内外业务增长,百套 TiDB 的选型与运维实战

导读 B 站对 TiDB 的应用已相当广泛&#xff0c;被应用在了 包括视频观看、一键三连、发送弹幕、撰写评论、阅读漫画以及视频后端的存储等场景&#xff0c; 目前拥有近 100 套集群。 本文由 B 站数据库负责人赵月顺撰写&#xff0c; 详细介绍了 B 站面临业务增长选择 TiDB 的…

二九(vue2-05)、父子通信v-model、sync、ref、¥nextTick、自定义指令、具名插槽、作用域插槽、综合案例 - 商品列表

1. 进阶语法 1.1 v-model 简化代码 App.vue <template><!-- 11-src-下拉封装 --><div class"app"><!-- <BaseSelect :cityId"selectId" changeId"handleChangeId"></BaseSelect> --><!-- v-model 简化…

flask-admin+Flask-WTF 实现实现增删改查

背景&#xff1a; flask-adminflask-wtf在网上可以搜索到很多资料&#xff0c;但有价值的很少&#xff0c;或许是太简单&#xff0c;或者是很少人这么用&#xff0c;或者。。。&#xff0c;本文将作者近礼拜摸索到的一点经验分享出来&#xff0c;给自己做个记录。 材料&#…

Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务间的通讯-消息队列【入门四】

继续上一篇任务创建 【Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务间的通讯-信号量【入门三】-CSDN博客】 今天要实现消息队列进行任务的通讯 一、从上一篇信号量通讯demo拷贝一份重命名&#xff0c;还是之前的两个任务&#xff0c;重命名了。 xTaskCreatePinned…

workman服务端开发模式-应用开发-后端api推送修改二

需要修改两个地方&#xff0c;第一个是总控制里面的续token延时&#xff0c;第二个是操作日志记录 一、总控续token延时方法 在根目录下app文件夹下controller文件夹下Base.php中修改isLoginAuth方法&#xff0c;具体代码如下&#xff1a; <?php /*** 总控制* User: 龙哥…

ReactPress 1.6.0:重塑博客体验,引领内容创新

ReactPress 是一个基于Next.js的博客&CMS系统&#xff0c; Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 体验地址&#xff1a;http://blog.gaoredu.com/ 今天&#xff0c;我们自豪地宣布ReactPress 1.6.0版本的正式发布&#xff0c;…

重拾设计模式--外观模式

文章目录 外观模式&#xff08;Facade Pattern&#xff09;概述定义 外观模式UML图作用 外观模式的结构C 代码示例1C代码示例2总结 外观模式&#xff08;Facade Pattern&#xff09;概述 定义 外观模式是一种结构型设计模式&#xff0c;它为子系统中的一组接口提供了一个统一…

接口测试Day03-postman断言关联

postman常用断言 注意&#xff1a;不需要手敲&#xff0c;点击自动生成 断言响应状态码 Status code&#xff1a;Code is 200 //断言响应状态码为 200 pm.test("Status code is 200", function () {pm.response.to.have.status(200); });pm: postman的实例 test() …

提升专业素养的实用指南

在当今竞争激烈的职场&#xff0c;仅仅拥有专业技能已经不足以立于不败之地。持续提升自身专业素养&#xff0c;才是保持竞争力、实现职业目标的关键。那么&#xff0c;如何才能有效地提升专业素养&#xff0c;在职业道路上走得更稳、更远呢&#xff1f;以下是一些实用性建议&a…

网上球鞋竞拍系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

tryhackme-Pre Security-Windows Fundamentals 3(Windows基础知识3)

任务1&#xff1a;Introduction&#xff08;介绍&#xff09; 我们将继续探索 Windows 操作系统。 总结前两个房间&#xff1a; 在 Windows Fundamentals 1 中&#xff0c;我们介绍了桌面、文件系统、用户帐户控制、控制面板、设置和任务管理器。在 Windows Fundamentals 2 中…

pdf转换文本:基于python的tesseract

电脑系统&#xff1a;win10专业版 不能访问需要魔法上网 安装tesseract 在GitHub上下载:tesseract下载地址 找到自己电脑版本下载 双击安装&#xff0c;一路next&#xff0c;除了这一步 第三个加号点开&#xff0c;把带Chinese的都勾选 安装完成后配置环境&#xff0c;Win …

国产云厂商数据库产品--思维导图

为了对比国产云厂商数据库产品&#xff0c;我查阅了各云厂商的官方介绍&#xff0c;墨天轮等平台的部分数据和文章&#xff0c;整理出了简易的思维导图。 会去整理&#xff0c;也是因为有点懵&#xff0c;比如说阿里的PolarDB数据库&#xff0c;看起来就是一个数据库&#xff…

MongoDB(下)

MongoDB 索引 MongoDB 索引有什么用? 和关系型数据库类似&#xff0c;MongoDB 中也有索引。索引的目的主要是用来提高查询效率&#xff0c;如果没有索引的话&#xff0c;MongoDB 必须执行 集合扫描 &#xff0c;即扫描集合中的每个文档&#xff0c;以选择与查询语句匹配的文…

Unity 3D饼状图效果

一. 效果展示 二.基础类 using System.Collections; using System.Collections.Generic; using UnityEngine;public class DrawCylinder : MonoBehaviour {// 网格渲染器MeshRenderer meshRenderer;// 网格过滤器MeshFilter meshFilter;// 用来存放顶点数据List<Vector3>…

吉利前端、AI面试

诸葛耘墒的在线视频面试 1、小程序端AI视频面试 虚拟人面试官提问 视频口述回答 1、最近的两份工作经历&#xff0c;以及上一份离职原因2、在过往的工作或生活中&#xff0c;需要学习掌握一项与工作有关的技能或兴趣爱好时&#xff0c;你会运用哪些方法和诀窍&#xff0c;投入…

基于容器的云原生,让业务更自由地翱翔云端

无论是要构建一个应用或开发一个更庞大的解决方案&#xff0c;在技术选型时&#xff0c;技术的开放性和可移植性已经成为很多企业优先考虑的问题之一。毕竟没人希望自己未来的发展方向和成长速度被自己若干年前选择使用的某项技术所限制或拖累。 那么当你的业务已经上云&#x…

S32K324 Stack异常分析及解决方案

文章目录 前言正向排查尝试反向排查问题原因分析问题解决处理总结前言 在项目开发过程中,在一次软件变更时,调整了task优先级之后导致应用层软件中的float数据经常性的变为NAN,导致应用层功能失效。本文记录下这个bug的分析及解决过程。 正向排查尝试 由于问题复现的概率…

28、基于springboot的房屋租赁系统

房屋是人类生活栖息的重要场所&#xff0c;随着城市中的流动人口的增多&#xff0c;人们对房屋租赁需求越来越高&#xff0c;为满足用户查询房屋、预约看房、房屋租赁的需求&#xff0c;特开发了本基于Spring Boot的房屋租赁系统。 本文重点阐述了房屋租赁系统的开发过程&…