ubuntu24.04使用opencv4

  • ubuntu24.04LTS自带opencv4.5
  • 代码实例
//opencv_example.cpp
#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 读取图像
    cv::Mat img = cv::imread("image.jpg", cv::IMREAD_COLOR);
    if (img.empty()) {
        std::cerr << "无法读取图像!" << std::endl;
        return -1;
    }

    // 显示图像
    cv::imshow("显示图像", img);
    cv::waitKey(0); // 等待按键
    return 0;
}
  • 编译( usr/include/opencv4包含opencv2目录,编译执行导入外面一层目录)
g++ opencv_example.cpp -o opencv_example `pkg-config --cflags --libs opencv4`
  • 执行
opencv_example

link-use sift : https://stackoverflow.com/questions/22722772/how-to-use-sift-in-opencv

安装拓展包

  • link: https://github.com/opencv/opencv_contrib.git
    OpenCV Contrib 是 OpenCV 的一个附加模块库,包含了一些在核心 OpenCV 库中没有的额外功能和算法。它的主要作用和特点包括:

介绍

1. 扩展功能

OpenCV Contrib 提供了一些额外的计算机视觉和图像处理功能,这些功能可能不够成熟或不够通用,无法包含在核心 OpenCV 中。通过使用 Contrib 模块,用户可以访问这些实验性或特定领域的功能。

2. 额外的算法

Contrib 模块中包含了一些特定的算法和工具,例如:

  • xfeatures2d:包含 SIFT、SURF 和其他特征检测和描述子提取算法。
  • text:用于文本检测和识别的工具。
  • tracking:包含多种目标跟踪算法。
  • saliency:用于显著性检测的算法。
  • face:人脸检测和识别的相关功能。

基础

致命陷阱: cv::Mat

  • 只在创建Mat的时候,(row,col),其余(col,row)
  • 如下,创建了一个3*row行,3*col列的图像
    cv::Mat globalImage=cv::Mat::zeros(3*row, 3*col, CV_8UC3);
  • 所有的向量位置,也是(col,row)的形式: 图像(row,col)的位置表示为(col,row);
        ori_corners.push_back((cv::Mat_<double>(3,1) << col-1, 0,1));
  • col代表x,row代表y

cv::Rect

cv::Rect(0, 0, img2.cols, img2.rows) 创建了一个从 (0, 0) 开始,宽度为 img2.cols,高度为 img2.rows 的矩形,通常表示整个图像 img2 的区域。

cv::vec4f

  • 表示2D直线时,前两个表示方向,后两个表示端点;

操作

opencv如何把一个图像的某个菱形区域粘贴到另一个图像上?

在OpenCV中,可以通过以下步骤将一个图像的某个菱形区域粘贴到另一个图像上:

  1. 读取图像:使用 cv::imread 读取源图像和目标图像。
  2. 定义菱形区域:通过指定菱形的中心和大小,计算出菱形区域的四个顶点。
  3. 创建掩膜:使用掩膜来提取源图像中的菱形区域。
  4. 粘贴区域:将提取的菱形区域粘贴到目标图像的指定位置。

以下是一个示例代码,演示如何实现这一过程:

C++ 示例代码

#include <opencv2/opencv.hpp>

int main() {
    // 读取源图像和目标图像
    cv::Mat sourceImage = cv::imread("source_image.jpg");
    cv::Mat targetImage = cv::imread("target_image.jpg");

    // 检查图像是否成功读取
    if (sourceImage.empty() || targetImage.empty()) {
        std::cerr << "Could not open or find the images!" << std::endl;
        return -1;
    }

    // 定义菱形区域的中心和大小
    cv::Point center(100, 100); // 菱形中心
    int width = 80; // 菱形的宽度
    int height = 80; // 菱形的高度

    // 计算菱形的四个顶点
    std::vector<cv::Point> diamondPoints;
    diamondPoints.push_back(cv::Point(center.x, center.y - height / 2)); // 上顶点
    diamondPoints.push_back(cv::Point(center.x + width / 2, center.y)); // 右顶点
    diamondPoints.push_back(cv::Point(center.x, center.y + height / 2)); // 下顶点
    diamondPoints.push_back(cv::Point(center.x - width / 2, center.y)); // 左顶点

    // 创建掩膜
    cv::Mat mask = cv::Mat::zeros(sourceImage.size(), CV_8UC1);
    cv::fillConvexPoly(mask, diamondPoints, cv::Scalar(255));

    // 提取菱形区域
    cv::Mat diamondRegion;
    sourceImage.copyTo(diamondRegion, mask);

    // 定义粘贴位置
    cv::Point pasteLocation(50, 50); // 在目标图像上的粘贴位置

    // 将菱形区域粘贴到目标图像上
    for (int y = 0; y < diamondRegion.rows; y++) {
        for (int x = 0; x < diamondRegion.cols; x++) {
            if (mask.at<uchar>(y, x) > 0) { // 检查掩膜
                targetImage.at<cv::Vec3b>(pasteLocation.y + y, pasteLocation.x + x) = diamondRegion.at<cv::Vec3b>(y, x);
            }
        }
    }

    // 显示结果
    cv::imshow("Result", targetImage);
    cv::waitKey(0);
    return 0;
}

说明:

  1. 读取图像:使用 cv::imread 读取源图像和目标图像。
  2. 定义菱形区域:通过指定菱形的中心和大小,计算出菱形的四个顶点。
  3. 创建掩膜:使用 cv::fillConvexPoly 创建一个掩膜,填充菱形区域。
  4. 提取菱形区域:使用掩膜从源图像中提取菱形区域。
  5. 粘贴区域:将提取的菱形区域粘贴到目标图像的指定位置。
  6. 显示结果:使用 cv::imshow 显示结果图像。

注意事项:

  • 确保粘贴位置在目标图像的有效范围内,以避免越界访问。
  • 如果源图像和目标图像的大小不同,可能需要调整菱形区域的大小或粘贴位置。

simple multi-band blending

  • link1: https://blog.csdn.net/m0_59023219/article/details/130733220
  • link2:https://blog.csdn.net/qq_46396470/article/details/140087963
#include <opencv2/opencv.hpp>
#include <vector>

using namespace cv;

// 函数:创建拉普拉斯金字塔
std::vector<Mat> createLaplacianPyramid(const Mat& image, int levels) {
    std::vector<Mat> pyramid;
    Mat current = image.clone();
    for (int i = 0; i < levels; i++) {
        Mat down;
        pyrDown(current, down);
        Mat laplacian = current - downsample(down, current.size());
        pyramid.push_back(laplacian);
        current = down;
    }
    pyramid.push_back(current); // 最底层
    return pyramid;
}

// 函数:重建图像
Mat reconstructFromPyramid(const std::vector<Mat>& pyramid) {
    Mat current = pyramid.back();
    for (int i = pyramid.size() - 2; i >= 0; i--) {
        current = pyrUp(current) + pyramid[i]; // 使用 pyrUp 进行上采样
    }
    return current;
}

// 函数:多频带混合
Mat multiBandBlending(const Mat& img1, const Mat& img2, int levels) {
    // 创建拉普拉斯金字塔
    std::vector<Mat> laplacian1 = createLaplacianPyramid(img1, levels);
    std::vector<Mat> laplacian2 = createLaplacianPyramid(img2, levels);

    // 混合频带
    std::vector<Mat> blendedPyramid;
    for (size_t i = 0; i < laplacian1.size(); i++) {
        Mat blended = (laplacian1[i] + laplacian2[i]) / 2; // 简单的平均混合
        blendedPyramid.push_back(blended);
    }

    // 重建图像
    return reconstructFromPyramid(blendedPyramid);
}

int main() {
    // 读取图像
    Mat img1 = imread("image1.jpg");
    Mat img2 = imread("image2.jpg");

    if (img1.empty() || img2.empty()) {
        std::cerr << "无法读取图像!" << std::endl;
        return -1;
    }

    // 确保图像大小相同
    if (img1.size() != img2.size()) {
        resize(img2, img2, img1.size());
    }

    // 进行多频带混合
    Mat blended = multiBandBlending(img1, img2, 5);

    // 显示结果
    imshow("Blended Image", blended);
    waitKey(0);
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年图像处理、多媒体技术与机器学习

重要信息 官网&#xff1a;www.ipmml.org 时间&#xff1a;2024年12月27-29日 地点&#xff1a;中国-大理 简介 2024年图像处理、多媒体技术与机器学习&#xff08;CIPMT 2024&#xff09;将于2024年12月27-29日于中国大理召开。将围绕图像处理与多媒体技术、机器学习等在…

用Python在Excel工作表中创建、修改及删除表格区域

在数据分析和自动化处理的工作中&#xff0c;Excel作为一种强大的工具被广泛应用&#xff0c;而通过Python来操作Excel工作表中的表格&#xff0c;可以极大提高工作效率。表格&#xff08;Table&#xff09;是Excel中的一种重要结构&#xff0c;它是一个特殊的单元格区域&#…

【AI】✈️问答页面搭建-内网穿透公网可访问!

目录 &#x1f44b;前言 &#x1f440;一、后端改动 &#x1f331;二、内网穿透 &#x1f49e;️三、前端改动 &#x1f379;四、测试 &#x1f4eb;五、章末 &#x1f44b;前言 小伙伴们大家好&#xff0c;上次本地搭建了一个简单的 ai 页面&#xff0c;实现流式输出问答…

GM_T 0039《密码模块安全检测要求》题目

单项选择题 根据GM/T 0039《密码模块安全检测要求》,送检单位的密码模块应包括()密码主管角色。 A.一个 B.两个 C.至少一个 D.至少两个 正确答案:C 多项选择题 根据GM/T 0039《密码模块安全检测要求》,关于非入侵式安全,以下属于安全三级密码模块要求的是()。 …

使用生存分析进行游戏时间测量

标题&#xff1a;Playtime Measurement with Survival Analysis 作者&#xff1a;Markus Viljanen, Antti Airola, Jukka Heikkonen, Tapio Pahikkala 译者&#xff1a;游戏数据科学 1 游戏中的游戏时间 1.1 为什么游戏时间很重要 游戏分析在理解玩家行为方面变得越来越重…

Linux快速入门-兼期末快速复习使用

Linux快速入门-兼期末快速复习使用 一小时快速入门linux快速一&#xff1a;Linux操作系统概述1. Linux概述1.1 定义与特点1.2 起源与发展1.3 Linux结构1.4 版本类别1.5 应用和发展方向 2. 安装与启动2.1 Windows下VMware安装Linux2.2 安装Ubuntu 快速二&#xff1a;linux的桌面…

制造研发企业与IPD管理体系

芯片/半导体/制造研发型企业&#xff0c;大都知道华为使用过的IPD管理体系&#xff0c;但大家用到什么程度&#xff0c;那就是参差不齐了。 因为IPD管理体系它只是一个管理理念&#xff0c;是一个方法论。它需要有相应的组织架构来承载&#xff0c;它有很复杂的流程需要有IT系统…

帝国CMS自动生成标题图片并写进数据库

帝国CMS背景可自定义&#xff0c;可单独背景也可以随机背景,此插件根帝国cms官方论坛帖子改的&#xff0c;增加了生成图片后写入数据库,笔者的古诗词网 www.gushichi.com 也是这样设置的。 效果图 将下面的代码插入到/e/class/userfun.php中增加如下函数 单独背景代码 //自动…

数据分析和AI丨知识图谱,AI革命中数据集成和模型构建的关键推动者

人工智能&#xff08;AI&#xff09;已经吸引了数据科学家、技术领导者以及任何使用数据进行商业决策者的兴趣。绝大多数企业都希望利用人工智能技术来增强洞察力和生产力&#xff0c;而对于这些企业而言&#xff0c;数据集的质量差成为了最主要的障碍。 数据源需要进行清洗且明…

java小知识点:比较器

java中自主排序主要根据一个Comparator类来实现。 他内部实现用的是Timsort策略。大概思想是说将整个集合分成几个小段&#xff0c;每个小段分别排序&#xff0c;然后再拼在一起。 主要用法是传入两个数&#xff08;也可以不是Integer或int类型&#xff0c;这里只是把他们都统称…

【嵌入式开发笔记】OpenOCD到嵌入式调试

最近在把玩一块Risc-V的开发板&#xff0c;使用开发板调试时&#xff0c;需要用到专门的下载器和OpenOCD进行调试。 为了连接这个板子&#xff0c;费了九牛二虎之力。 这里简单记录一下自己的折腾经过吧。 0x00 环境准备 0x0001 调试背景 系统&#xff1a;Virtual Box Ub…

安装MongoDB,环境配置

官网下载地址&#xff1a;MongoDB Shell Download | MongoDB 选择版本 安装 下载完成双击打开 点击mongodb-windows-x86_64-8.0.0-signed 选择安装地址 检查安装地址 安装成功 二.配置MongoDB数据库环境 1.找到安装好MongoDB的bin路径 复制bin路径 打开此电脑 -> 打开高级…

15.初识接口1 C#

这是一个用于实验接口的代码 适合初认识接口的人 【CSDN开头介绍】&#xff08;文心一言AI生成&#xff09; 在C#编程世界中&#xff0c;接口&#xff08;Interface&#xff09;扮演着至关重要的角色&#xff0c;它定义了一组方法&#xff0c;但不提供这些方法的实现。它要求所…

2.学习TypeScript 编译选项配置

自动编译 我们可以使用 tsc ...../.ts -w 命令进行ts文件的自动编译 执行后 编译会持续侦听 自动编译 这种方式只能侦听一个文件 对做项目肯定是不现实的&#xff0c;为了解决这个问题&#xff0c;我们需要添加一个tsconfig.json文件&#xff0c;写入一个基础对象 再有tsconfi…

Python爬虫(5) --爬取网页视频

文章目录 爬虫爬取视频指定url发送请求UA伪装请求页面 获取想要的数据解析定位定位音视频位置 存放视频完整代码实现总结 爬虫 Python 爬虫是一种自动化工具&#xff0c;用于从互联网上抓取网页数据并提取有用的信息。Python 因其简洁的语法和丰富的库支持&#xff08;如 requ…

VS Code Copilot 与 Cursor 对比

选手简介 VS Code Copilot&#xff1a;算是“老牌”编程助手了&#xff0c;虽然Copilot在别的编辑器上也有扩展&#xff0c;不过体验最好的还是VS Code&#xff0c;毕竟都是微软家的所以功能集成更好一些&#xff1b;主要提供的是Complete和Chat能力&#xff0c;也就是代码补全…

基础元器件的学习

1、二极管 1.1二极管的符号 ZD是稳压二极管 VD、V、D是普通二极管的符号。 1.2二极管的反向恢复时间 首先交流电为上正下负&#xff0c;然后下正上负。当二极管接到反向电压&#xff0c;二极管存在寄生电容&#xff0c;电压不能立刻突变&#xff0c;当输入频率变高时&#…

unipp中使用阿里图标,以及闭坑指南

-----------------------------------------------------点赞收藏才是更新的动力------------------------------------------------- unipp中使用阿里图标 官网下载图标在项目中引入使用注意事项 官网下载图标 进入阿里图标网站 将需要下载的图标添加到购物车中 2. 直接下载…

QtCreator配置github copilot实现AI辅助编程

文章目录 1、概述2、配置环境3、演示 1、概述 新时代的浪潮早就已经来临&#xff0c;上不了船的人终将被抛弃&#xff0c;合理使用AI辅助开发、提升效率是大趋势&#xff0c;注意也不要过于依赖。 2024年12月18日&#xff0c;GitHub 官方宣布了一个激动人心的重大消息&#xf…

web实操8-cookie

会话技术 会话&#xff1a; 一次会话中包含多次请求和响应。 客户端浏览器访问服务器的资源&#xff0c;只要客户端或者服务器端不关闭&#xff0c;这始终在一次会话范围内&#xff0c;这一次会话范围内可以包含多次请求并且收到多次相应。 一次会话&#xff1a;浏览器第一…