C++ 程序使用 OpenCV 生成两个黑色的灰度图像,并添加随机特征点,然后将这两个图像合并为一张图像并显示

news2024/10/7 20:24:55

文章目录

    • 源码文件
    • 功能解读
    • 编译文件

源码文件

#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>

std::vector<cv::KeyPoint> generateRandomKeyPoints(const cv::Mat& image, int numPoints) {
    std::vector<cv::KeyPoint> keypoints;
    cv::RNG rng; // OpenCV 随机数生成器
    for (int i = 0; i < numPoints; ++i) {
        cv::Point2f pt(rng.uniform(0.f, (float)image.cols), rng.uniform(0.f, (float)image.rows));
        keypoints.push_back(cv::KeyPoint(pt, 1.f));
    }
    return keypoints;
}

int main() {
    // 生成两个简单的灰度图像
    cv::Mat imLeft = cv::Mat::zeros(240, 320, CV_8UC1); // 240x320 的黑色图像
    cv::Mat imRight = cv::Mat::zeros(240, 320, CV_8UC1);

    // 生成一些随机特征点
    std::vector<cv::KeyPoint> mvKeys = generateRandomKeyPoints(imLeft, 100);
    std::vector<cv::KeyPoint> mvKeysRight = generateRandomKeyPoints(imRight, 100);

    cv::Mat imLeftBGR;
    imLeftBGR = imLeft.clone();
    cv::cvtColor(imLeft, imLeftBGR, cv::COLOR_GRAY2BGR);
    cv::drawKeypoints(imLeftBGR, mvKeys, imLeftBGR, cv::Scalar(0, 0, 255));

    cv::Mat imRightBGR;
    imRightBGR = imRight.clone();
    cv::cvtColor(imRight, imRightBGR, cv::COLOR_GRAY2BGR);
    cv::drawKeypoints(imRightBGR, mvKeysRight, imRightBGR, cv::Scalar(0, 255, 0));

    cv::Mat mergedImage(imLeftBGR.rows, imLeftBGR.cols + imRightBGR.cols, imLeftBGR.type());
    imLeftBGR.copyTo(mergedImage(cv::Rect(0, 0, imLeftBGR.cols, imLeftBGR.rows)));
    imRightBGR.copyTo(mergedImage(cv::Rect(imLeftBGR.cols, 0, imRightBGR.cols, imRightBGR.rows)));


    cv::imshow("Merged Image", mergedImage);
    cv::waitKey(0);

    return 0;
}

在这里插入图片描述

功能解读

  1. 生成灰度图像:程序创建了两个大小为 240x320 像素的黑色灰度图像,分别命名为 imLeftimRight

  2. 生成随机特征点

    • 使用 generateRandomKeyPoints 函数在这两个图像上生成指定数量(在这个例子中是100个)的随机特征点。
    • 这些特征点存储在 std::vector<cv::KeyPoint> 类型的 mvKeysmvKeysRight 中。
  3. 处理和显示左图像(imLeft

    • 克隆 imLeftimLeftBGR
    • 使用 cv::cvtColorimLeftBGR 从灰度转换为 BGR 彩色格式。
    • 使用 cv::drawKeypointsimLeftBGR 上绘制 mvKeys 中的特征点,这些点以红色显示(BGR: 0, 0, 255)。
  4. 处理和显示右图像(imRight

    • 类似地,克隆 imRightimRightBGR 并将其转换为 BGR 彩色格式。
    • 使用 cv::drawKeypointsimRightBGR 上绘制 mvKeysRight 中的特征点,这些点以绿色显示(BGR: 0, 255, 0)。
  5. 合并图像

    • 创建一个新的图像 mergedImage,大小足以容纳 imLeftBGRimRightBGR 并排放置。
    • imLeftBGRimRightBGR 分别复制到 mergedImage 的左侧和右侧。
  6. 显示合并后的图像

    • 使用 cv::imshow 显示 mergedImage
    • cv::waitKey(0) 使得图像窗口保持打开状态,直到用户按下任意键。

总体来说,这个程序演示了如何在 OpenCV 中生成图像,添加特征点,进行基本的图像处理(例如颜色空间转换和特征点绘制),以及如何合并和显示图像。这种类型的处理在计算机视觉和图像分析中很常见。

编译文件

cmake_minimum_required(VERSION 3.10)
project(ImagePyramid)

# 设置C++标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 找到OpenCV包
find_package(OpenCV REQUIRED)

# 包含OpenCV头文件
include_directories(${OpenCV_INCLUDE_DIRS})

# 添加可执行文件
add_executable(ImagePyramid main.cpp)

# 链接OpenCV库
target_link_libraries(ImagePyramid ${OpenCV_LIBS})

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

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

相关文章

Flume1.9基础学习

文章目录 一、Flume 入门概述1、概述2、Flume 基础架构2.1 Agent2.2 Source2.3 Sink2.4 Channel2.5 Event 3、Flume 安装部署3.1 安装地址3.2 安装部署 二、Flume 入门案例1、监控端口数据官方案例1.1 概述1.2 实现步骤 2、实时监控单个追加文件2.1 概述2.2 实现步骤 3、实时监…

体感大屏互动游戏开发

体感大屏互动游戏是一种结合了体感技术和大屏幕显示的游戏形式&#xff0c;旨在通过玩家的身体动作和互动&#xff0c;提供更加身临其境的游戏体验。这种类型的游戏常常采用各种体感设备&#xff0c;如深度摄像头、体感控制器、传感器等&#xff0c;使玩家能够通过真实的动作来…

C++算法学习心得六.回溯算法(3)

1.子集II&#xff08;90题&#xff09; 题目描述&#xff1a; 给定一个可能包含重复元素的整数数组 nums&#xff0c;返回该数组所有可能的子集&#xff08;幂集&#xff09;。 说明&#xff1a;解集不能包含重复的子集。 示例: 输入: [1,2,2]输出: [ [2], [1], [1,2,2], …

centos 安装mysql5.7教程

一&#xff0c;配置yum mysql5.7安装源 配置yum mysql5.7安装源 yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 配置mysql5.7安装源成功 查看配置成功的安装源 yum repolist enabled | grep "mysql*" 执行后看到已配…

大模型|基础——长短时记忆网络

文章目录 LSTM遗忘门输入门整合信息特点实现神经单元的内部计算门控控制——可以动态选择信息在大数据量的情况下&#xff0c;可有效缓解梯度 LSTM 遗忘门 遗忘门&#xff0c;是否进行遗忘。 如果通过计算&#xff0c;计算出来的结果为0&#xff0c;就选择遗弃。 如果遗忘&…

14.4.2 Flash读取与修改数据库中的数据

14.4.2 Flash读取与修改数据库中的数据 计数器是网站必不可少的统计工具&#xff0c;使用计数器可以使网站管理者对网站的访问情况有一个清晰的了解。如果仅仅是统计首页访问量的话&#xff0c;用文本文件来存储数据就可以了&#xff0c;但如果统计的数据量比较大的话(如文章系…

MySQL和Redis的事务有什么异同?

MySQL和Redis是两种不同类型的数据库管理系统&#xff0c;它们在事务处理方面有一些重要的异同点。 MySQL事务&#xff1a; ACID属性&#xff1a; MySQL是一个关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;支持ACID属性&#xff0c;即原子性&#xff08;Ato…

【CANoe使用大全】——Graphics窗口

文章目录 1.Graphics作用2.Graphics窗口打开方式2.1.Analysis—>Graphics2.2.Measurement Setup ------> Graphics 3.变量添加4.Graphics窗口菜单栏介绍4.1. 单个测量光标4.2. 差分测量光标4.3.Y轴的显示方式4.3.1.Show Y-Axis of Selected Signal4.3.2.Show All Y-Axis4…

【java题解】题目 1779: 你的第一个程序;题目 1779: 你的第一个程序;题目 1173: 计算球体积

目录 题目 1779: 你的第一个程序 题目描述 输入格式 输出格式 样例输入 样例输出 题解 题目 1173: 计算球体积 题目描述 输入格式 输出格式 样例输入 样例输出 题解 题目 1267: AB Problem 题目描述 输入格式 输出格式 样例输入 样例输出 题解 从今天开始…

前端面试题-深拷贝浅拷贝-浏览器存储-原型链-闭包-call,bind,apply的区别

前端面试题-深拷贝浅拷贝-浏览器存储-原型链-闭包-call,bind,apply的区别 什么是深拷贝什么是浅拷贝cookie,sessionStorage和localStrorage的区别是什么什么是原型链prototype原型 作用域什么是闭包&#xff0c;闭包的作用场景是什么call bind和apply的区别 什么是深拷贝什么是…

Android颜色选择器

Android颜色选择器&#xff0c;弹框提示选择颜色。效果如图。点击或者滑动圆环和底部横向渐变色调整颜色&#xff0c;中间圆圈的颜色就是最终选中的颜色。点击圆圈确认颜色。 使用 //颜色选择Dialogprivate void showColorPickDialog(int position, int colorInt){ColorPickerD…

Tomcat session复制及session共享技术

目录 1、环境 2、配置测试页面 3、配置session共享 前言&#xff1a; 为什么要做session复制或共享 实现Session复制或Session共享的目的是为了在多个Tomcat实例之间实现Session的无缝转移和共享&#xff0c;以提供更高的可伸缩性、负载均衡和容错性。以下是一些原因&#x…

浅谈DNS的工作原理及其作用

DNS&#xff0c;全称为Domain Name System&#xff0c;即域名系统&#xff0c;是一种用于将域名和IP地址相互映射的分布式数据库系统。它将可读的域名转换为对应的IP地址&#xff0c;使得用户可以更方便地通过域名来访问网络上的资源。今天锐成就简单探讨一下DNS的工作原理及其…

Redis 面试题 | 11.精选Redis高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Java服务端使用freemarker+wkhtmltoimage生成Echart图片

目录 1.通过 freemarker 将ftl转成html 1.1 freemarker 手册: 1.2 添加freemarker maven依赖 1.3 添加 echart-test.ftl 模版文件 1.4 添加 FreemarkerTool 工具类 1.5 添加测试main方法 1.6 运行,生成echart-test-时间戳.html 文件 2. 通过wkhtmltoimage将html 转为p…

Flink max maxby区别

max只会显示指定字段的大小变化&#xff0c;而maxBy会显示其他字段的变化。 max&#xff1a;取指定字段的当前的最大值&#xff0c;如果有多个字段&#xff0c;其他非比较字段&#xff0c;以第一条为准。 maxBy&#xff1a;取指定字段的当前的最大值&#xff0c;如果有多个字段…

企业出海数据合规:GDPR下数据出境的条件

一、GDPR对数据出镜的规制 GDPR第五章集中规定了数据跨境流动的形式&#xff0c;总的来说给出了三种个人数据出境的条件&#xff0c;分别是基于充分决定的数据传输&#xff1b;基于采取适当保障措施的数据传输&#xff1b;以及基于特殊情况的减损条款&#xff0c;分别对应的是…

windows下git pull超时,ping不通github

报错 ssh: connect to host github.com port 22: Connection timed out fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 解决办法 修改hosts 最后加一行&#xff0c;文件位置&#xff1a;…

Leetcode:二分搜索树层次遍历

题目&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例&#xff1a; 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,…

16、Kafka ------ SpringBoot 整合 Kafka (配置 Kafka 属性 及对应的 属性处理类 解析)

目录 配置 Kafka 及对应的 属性处理类配置KafkaKafka配置属性的约定代码演示生产者相关的配置消费者相关的配置 代码&#xff08;配置文件&#xff09;application.properties 配置 Kafka 及对应的 属性处理类 配置Kafka spring.kafka.* 开头的配置属性&#xff0c;这些属性将由…