c++视觉检测-----角点检测

news2025/2/25 13:20:56

角点检测:cornerHarris()

cornerHarris()函数是OpenCV中用于执行Harris角点检测的函数。Harris角点检测是一种用于检测图像中角点的技术,通常用于特征检测和图像匹配。以下是cornerHarris()函数的用法:

void cornerHarris(
    InputArray src,            // 输入图像(单通道、8位或32位浮点类型)
    OutputArray dst,           // 输出角点响应图像,通常是32位浮点类型
    int blockSize,             // 角点检测中的邻域大小(建议为2-3)
    int ksize,                 // Sobel算子的孔径大小(建议为3)
    double k,                  // Harris检测方程中的自由参数,一般取0.04 - 0.06
    int borderType = BORDER_DEFAULT
);

以下是参数的解释:

  • src:输入图像,通常是单通道的8位或32位浮点型图像。

  • dst:输出角点响应图像,通常是一个32位浮点型图像,用于存储检测到的角点的响应值。

  • blockSize:指定角点检测时使用的邻域大小。它通常是2x2或3x3的小邻域。

  • ksize:Sobel算子的孔径大小,用于计算图像梯度。

  • k:Harris检测方程中的自由参数,一般取0.04到0.06之间的值。它决定了角点响应的敏感性。

  • borderType:边界类型,通常设置为BORDER_DEFAULT

cornerHarris()函数执行Harris角点检测,并将检测结果存储在dst中。通常,你可以检查dst中的响应值来确定图像中的角点位置。较高的响应值通常表示角点。

以下是一个简单的示例,演示如何使用cornerHarris()函数执行Harris角点检测:

#include "opencv2/opencv.hpp"

using namespace cv;

int main()
{
    Mat srcImage = imread("1.jpg", IMREAD_GRAYSCALE);
    if (srcImage.empty())
    {
        std::cout << "Could not open or find the image!" << std::endl;
        return -1;
    }

    Mat cornerResponse;
    cornerHarris(srcImage, cornerResponse, 2, 3, 0.04);

    Mat cornerMap = Mat::zeros(cornerResponse.size(), CV_8UC1);

    double maxResponse;
    minMaxLoc(cornerResponse, 0, &maxResponse);

    for (int i = 0; i < cornerResponse.rows; i++)
    {
        for (int j = 0; j < cornerResponse.cols; j++)
        {
            if (cornerResponse.at<float>(i, j) > 0.01 * maxResponse)
            {
                circle(cornerMap, Point(j, i), 5, Scalar(255), 2);
            }
        }
    }

    imshow("Corner Map", cornerMap);
    waitKey(0);

    return 0;
}

在此示例中,我们加载了一个灰度图像,然后使用cornerHarris()函数进行角点检测。最后,我们在角点上绘制圆圈,将检测到的角点可视化。

在这里插入图片描述

使用本地相机进行角点检测

#include <opencv2/opencv.hpp>

using namespace cv;

// 滑块回调函数
void onTrackbar(int, void*);

int main()
{
    VideoCapture cap(0);
    if (!cap.isOpened())
    {
        std::cerr << "Error: Could not open the camera." << std::endl;
        return -1;
    }

    Mat frame;
    Mat grayFrame;

    namedWindow("Harris Corner Detection", WINDOW_AUTOSIZE);

    int blockSize = 2;
    int ksize = 3;
    int k = 0.04;
    int thresholdValue = 100;
    int radius = 5;

    createTrackbar("Block Size", "Harris Corner Detection", &blockSize, 10, onTrackbar);
    createTrackbar("K-Size", "Harris Corner Detection", &ksize, 10, onTrackbar);
    createTrackbar("K Value", "Harris Corner Detection", &k, 100, onTrackbar);
    createTrackbar("Threshold", "Harris Corner Detection", &thresholdValue, 1000, onTrackbar);
    createTrackbar("Radius", "Harris Corner Detection", &radius, 20, onTrackbar);

    while (true)
    {
        cap >> frame;

        if (frame.empty())
        {
            break;
        }

        cvtColor(frame, grayFrame, COLOR_BGR2GRAY);

        Mat cornerResponse;
        cornerHarris(grayFrame, cornerResponse, blockSize * 2 + 2, ksize * 2 + 1, k / 100.0);

        Mat cornerMap = Mat::zeros(cornerResponse.size(), CV_8UC1);

        double maxResponse;
        minMaxLoc(cornerResponse, 0, &maxResponse);

        for (int i = 0; i < cornerResponse.rows; i++)
        {
            for (int j = 0; j < cornerResponse.cols; j++)
            {
                if (cornerResponse.at<float>(i, j) > thresholdValue / 1000.0 * maxResponse)
                {
                    circle(cornerMap, Point(j, i), radius, Scalar(255), 2);
                }
            }
        }

        imshow("Harris Corner Detection", cornerMap);

        if (waitKey(30) >= 0)
        {
            break;
        }
    }

    return 0;
}

void onTrackbar(int, void*)
{
    // You can add custom behavior when trackbars are moved if needed.
}

使用本地相机进行二值图角点检测

#include <opencv2/opencv.hpp>

using namespace cv;

Mat frame; // 用于存储摄像头捕捉的帧
Mat cornerResponse; // 存储Harris角点响应
Mat cornerMap; // 二值图像
double maxResponse; // 最大响应值


int main()
{
    VideoCapture cap(0); // 打开默认相机(通常是内置摄像头)

    if (!cap.isOpened())
    {
        std::cerr << "Error: Could not open the camera." << endl;
        return -1;
    }

    namedWindow("Harris Corner Map", WINDOW_AUTOSIZE);

    while (true)
    {
        cap >> frame; // 从摄像头捕捉帧

        if (frame.empty())
        {
            break;
        }

        // 转换为灰度图像
        Mat gray;
        cvtColor(frame, gray, COLOR_BGR2GRAY);

        // Harris角点检测
        cornerHarris(gray, cornerResponse, 2, 3, 0.04);

        // 查找最大响应值
        minMaxLoc(cornerResponse, 0, &maxResponse);

        // 初始化二值图像
        cornerMap = Mat::zeros(cornerResponse.size(), CV_8UC1);

        // 根据阈值将角点标记为白色或黑色
        for (int i = 0; i < cornerResponse.rows; i++)
        {
            for (int j = 0; j < cornerResponse.cols; j++)
            {
                if (cornerResponse.at<float>(i, j) > 0.01* maxResponse)
                {
                    cornerMap.at<uchar>(i, j) = 255;
                }
                else
                {
                    cornerMap.at<uchar>(i, j) = 0;
                }
            }
        }

        imshow("Harris Corner Map", cornerMap);

        if (waitKey(30) == 27) // 按下Esc键退出
        {
            break;
        }
    }

    cap.release();
    destroyAllWindows();

    return 0;
}

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

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

相关文章

数据库基础篇一

MySQL数据模型 关系型数据库通过表来存储数据的数据库 SQL分类 数据库操作 进入数据库 mysql -u root -p #输入密码即可在cmd命令行窗口使用mysql 1.查询 2.创建 create database test; create database if not exists test; #如果test数据库不存在&#xff0c;则创建tes…

day27--AJAX(bootstrap之modal,toast;接口文档的一些用法;AJAX原理)

目录 Bootstrap之Modal&#xff1a; 显示和隐藏方法 通过自定义属性&#xff1a; 使用JS来控制弹框&#xff1a; Bootstrap之Toast&#xff1a; 接口文档一些用法&#xff1a; 删除图书&#xff1a; 图片上传&#xff1a; 图片上传步骤&#xff1a; 修改头像&#xf…

Kopler.gl笔记:可视化功能总览

1 添加数据 2 添加图层 打开“数据层”菜单&#xff0c;开始可视化。 层&#xff08;Layers&#xff09;简单来说就是可以相互叠加的数据可视化。 3 添加过滤器 在地图上添加过滤器以限制显示的数据。过滤器必须基于数据集中的列。要创建新的过滤器&#xff0c;打开“过滤器…

【OpenCV-PyQt5-PyGame-imutils】探索Python中的图像和视频捕获:性能分析与选择指南

前言 随着计算机视觉和多媒体应用的不断发展&#xff0c;图像和视频捕获变得越来越重要。在Python中&#xff0c;有多种库和工具可供选择&#xff0c;用于打开摄像头、捕获图像、以及处理视频流。本文旨在为读者提供对这些捕获方法的全面了解&#xff0c;并介绍如何计算平均帧…

堆专题2 向上调整构建大顶堆

题目&#xff1a; 样例&#xff1a; 输入 6 3 2 6 5 8 7 输出 8 6 7 2 5 3 思路&#xff1a; 向上调整&#xff0c;就是从叶子结点开始 往 根节点 往上面调整&#xff0c;操作与 向下调整 操作类似&#xff0c;只是不用判断左右孩子&#xff0c;由于我们是从叶子结点开始 往 …

mac电脑版数字图像处理软件:ACDSee Photo Studio 9最新 for Mac

ACDSee Photo Studio 9是一款由ACD Systems开发的功能强大的照片管理和编辑软件&#xff0c;专为Mac用户提供一站式解决方案&#xff0c;方便用户轻松浏览、管理和编辑照片。该软件提供了许多实用的工具和功能&#xff0c;包括高效的导入和排序工具、强大的编辑工具、智能组织和…

淘宝价格,淘宝商品优惠券数据接口,淘宝商品销量接口,淘宝商品详情数据接口,淘宝API接口

淘宝价格和商品优惠券数据接口是淘宝平台提供的官方数据接口&#xff0c;通过调用接口&#xff0c;可以获取到淘宝商品的价格信息和优惠券数据。 获取淘宝价格和商品优惠券数据接口的步骤如下&#xff1a; 输入淘宝网址登陆淘宝账号密码。点击获取key和secret。调用获取buyer…

JS DataTable中导出PDF右侧列被截断的问题解决

JS DataTable中导出PDF右侧列被截断的问题解决 文章目录 JS DataTable中导出PDF右侧列被截断的问题解决一. 问题二. 解决办法三. 代码四. 参考资料 一. 问题 二. 解决办法 设置PDF大小和版型 orientation: landscape, pageSize: LEGAL,上述代码设置打印的PDF尺寸为LEGAL&…

400电话申请办理:为企业提供高效沟通的必备工具

在当今竞争激烈的商业环境中&#xff0c;企业需要与客户保持紧密联系&#xff0c;提供高效沟通渠道。而400电话作为一种便捷的客服热线&#xff0c;成为越来越多企业的首选。本文将介绍400电话的申请办理过程&#xff0c;帮助企业了解如何获得这一重要的沟通工具。 首先&#…

Xcode升级到15.0 解决DT_TOOLCHAIN_DIR问题

根据个人开发遇到的问题做的总结&#xff0c;公司要求Xcode 14.2 &#xff0c;Swift 5.7开发&#xff0c;由于升级了Mac 14.0系统后&#xff0c;Xcode 14.2不能使用&#xff0c;解决方案目前有2个 一、在原来Xcode 14.2 的显示包内容&#xff0c;如图 二、升级到Xcode的15.0后…

Android笔记(五):结合Compose组件利用ActivityResultLauncher解决多活动跳转返回数据

在本人博客中Android活动返回不在再支持startActivityForResult()后的处理方法已经记录采用ActivityResultLauncher来处理多活动的返回并传回数据的方式。但是采用的是布局xmlviewBinding技术。目前&#xff0c;谷歌官方推荐使用JetPack Compose组件来定义界面。在本文中&#…

DRESIS:全球首个综合耐药性数据库

耐药性已成为全球卫生保健的关键问题。目前已有的耐药相关数据库大都是针对某些疾病。本研究建立一个数据库DRESIS&#xff0c;全面描述具有耐药性的疾病和所有类型的耐药机制。公开访问网址&#xff1a;https://idrblab.org/dresis/ 01、ADTT:药物治疗靶点的变异; 02、IDUE:药…

cocos2d-x C++与Lua交互

Cocos版本&#xff1a; 3.10 Lua版本&#xff1a; 5.1.4 环境&#xff1a; window Visual Studio 2013 Lua Lua作为一种脚本语言&#xff0c; 它的运行需要有宿主的存在&#xff0c;通过Lua虚拟栈进行数据交互。 它的底层实现是C语言&#xff0c;C语言封装了很多的API接口&a…

【Jetpack Compose】BOM是什么?

前言 本篇旨在帮助小伙伴们了解和使用Compose中BOM相关的知识&#xff0c;在Compose的开发过程中更加便捷、统一的管理相关依赖信息。 BOM基础知识 Compose推出的BOM为物料清单的意思&#xff0c;BOM全称为Bill Of Materials&#xff0c;Compose推出BOM的意义旨在通过指定的…

【赠书活动】python自动售货机销售数据分析

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Win10删除文件需要TrustedInstaller权限的解决方法

在Win10电脑中&#xff0c;有时候在我们尝试删除某些文件或文件夹时&#xff0c;系统却提示要有TrustedInstaller权限才能删除成功。这是由于一些特定的系统文件或文件夹被保护&#xff0c;确保系统的稳定性和安全性。如果大家在删除文件也遇到这样的提示&#xff0c;那么可以按…

React18入门(第三篇)——React Hooks详解,React内置Hooks、自定义Hooks使用

文章目录 概述一、内置 Hook——useState1.1 响应式数据更新1.2 什么是 state1.3 state 特点&#xff08;一&#xff09;——异步更新1.4 state 特点&#xff08;二&#xff09;——可能会被合并1.5 state 特点&#xff08;三&#xff09;——不可变数据&#xff08;重要&#…

看一下链表结构

序、慢慢来才是最快的方法。 背景 链表(Linked List) 链表是一种常见的基础数据结构&#xff0c;是一种线性表。与顺序表不同的是&#xff0c;链表中的每个节点不是顺序存储的&#xff0c;而是通过节点的指针域指向到下一个节点。 1.链表的优缺点 2.链表的类型 单链表、双链表…

UDP 的报文结构

UDP的报文结构&#xff1a; 其中前面的源端口号和目的端口号&#xff0c;UDP长度和UDP检验和&#xff0c;它们都是2个字节。 那么什么是UDP长度呢&#xff0c;它指的是后面的数据的长度&#xff0c;换算单位也就是64kb&#xff0c;因此一个数据报&#xff08;数据&#xff09;最…

idea 启动项目报错 Command line is too long

1.idea 启动报错 Command line is too long&#xff0c;启动报错信息&#xff1a;Error running ‘Application‘: Command line is too long. 2.如何解决&#xff1f; 1&#xff09;idea打开一个项目。 2.打开项目下的*.idea* 文件夹下的 workspace.xml 文件。 3.在<co…