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中,可以通过以下步骤将一个图像的某个菱形区域粘贴到另一个图像上:
- 读取图像:使用
cv::imread
读取源图像和目标图像。 - 定义菱形区域:通过指定菱形的中心和大小,计算出菱形区域的四个顶点。
- 创建掩膜:使用掩膜来提取源图像中的菱形区域。
- 粘贴区域:将提取的菱形区域粘贴到目标图像的指定位置。
以下是一个示例代码,演示如何实现这一过程:
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;
}
说明:
- 读取图像:使用
cv::imread
读取源图像和目标图像。 - 定义菱形区域:通过指定菱形的中心和大小,计算出菱形的四个顶点。
- 创建掩膜:使用
cv::fillConvexPoly
创建一个掩膜,填充菱形区域。 - 提取菱形区域:使用掩膜从源图像中提取菱形区域。
- 粘贴区域:将提取的菱形区域粘贴到目标图像的指定位置。
- 显示结果:使用
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;
}
相关文章:
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 << "无法读…...

【项目构建】Gradle入门
本文适用: 不知道什么是项目构建,可以了解下Ant,Maven,Gradle的区别。知道什么是项目构建,了解Ant,Maven,可以看到Gradle是怎么做的。知道什么是项目构建,了解Ant,Maven&…...
Electron -- Electron应用主要核心(二)
Electron 应用主要由以下几个核心组成部分构成: 主进程(Main Process): Electron 应用的入口点是主进程,通常是 main.js 文件。它负责管理应用的生命周期,包括创建窗口、处理系统事件和应用更新等。主进程可…...

【前端开发】HTML+CSS+JavaScript前端三剑客的基础知识体系了解
前言 🌟🌟本期讲解关于HTMLCSSJavaScript的基础知识,小编带领大家简单过一遍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 …...

git命令恢复/还原某个文件、删除远程仓库中的文件
有时刚创建的远程仓库,可能无意中把一些没用的文件上传到仓库,本文介绍一下怎么删除这些文件。 一、git命令恢复某个文件 第一步:拉取最新代码 git pull 第二步: 查看git 修改的文件状态 git status 第三步:查看…...

二十一、Ingress 进阶实践
架构参考 使用hostnetwork,推荐的方式,使用单独的物理服务器,不部署业务pod的主机。 一、Ingress Nginx Controller 安装 采用helm的安装方式,进行部署。 官网地址: https://kubernetes.github.io/ingress-nginx/deploy/ github地址: https://github.com/kubernetes/in…...
ES学习Promise对象(九)
这里写目录标题 一、概念二、示例基本使用使用 Promise 对象封装Ajaxthen() 方法catch() 方法 一、概念 简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。Promise 是一个对象,Promise 提供统一…...

寻找适合小户型的开源知识库open source knowledge base之路
寻找一个开源的知识库,为了把以前花很多时间收集的信息或是项目/课程资料放到一个容易归类和管理的私有自主系统中,以便更容易查阅,花更少时间收集、对比版本及分享等一系列管理工作,同时确保在需要时可以相对快速找到有用的资料&…...

Linux高级--2.6 网络面试问题
tcp 与 udp的区别 1.tcp 是基于连接的 UDP是基于数据包 2.处理并发的方式不通 a.tcp用epoll进行监听的 b. udp是模拟tcp的连接过程,服务端开放一个IP端口,收到连接后,服务端用另一个IP和端口发包给客户端。 3.tcp根据协议MTU黏包及…...
在 CentOS 7 上安装 Node.js 20 并升级 GCC、make 和 glibc
在 CentOS 7 上安装 Node.js 20 并升级 GCC、make 和 glibc 📖 前言 在 CentOS 7 上使用 NVM 安装 Node.js 后,可能会遇到如下问题: node: /lib64/libm.so.6: version GLIBC_2.27’ not found (required by node) node: /lib64/libc.so.6:…...

音视频入门基础:MPEG2-TS专题(20)——ES流简介
《T-REC-H.222.0-202106-S!!PDF-E.pdf》第27页对ES进行了定义。ES流是PES packets(PES包)中编码的视频、编码的音频或其他编码的比特流。一个ES流(elementary stream)在具有且只有一个stream_id的PES packets序列中携带࿱…...

五子棋小游戏设计(Matlab)
基于Matlab的五子棋小游戏设计 (完整源码运行呈现的GUI界面) (完整的设计说明报告) 需要请随时联系博主,博主基本都在线,能秒回! 随着计算机技术的发展,将传统棋类游戏与编程技术…...
基于Pycharm与数据库的新闻管理系统(3)MongoDB
pip3 install pymongo 1.连接到MongoDB数据库 文件地址:db/mongo_db.py 从 pymongo 模块中导入 MongoClient 类;创建 MongoClient 的一个实例,该实例尝试使用提供的MongoDB连接字符串连接到MongoDB服务器。 from pymongo import MongoClie…...
WebRtc webrtc-streamer部署
文章目录 本文档只是为了留档方便以后工作运维,或者给同事分享文档内容比较简陋命令也不是特别全,不适合小白观看,如有不懂可以私信,上班期间都是在得 WebRtc webrtc-streamer 部署 docker run -p 8000:8000 -it mpromonet/webrt…...

CVPR-2024 | 具身导航模型大一统!NaviLLM:学习迈向具身导航的通用模型
作者:Duo Zheng, Shijia Huang, Lin Zhao, Yiwu Zhong, Liwei Wang 单位:香港中文大学,上海人工智能实验室,感知与交互智能中心 论文链接:Towards Learning a Generalist Model for Embodied Navigation(…...

CAN201 Introduction to Networking(计算机网络)Pt.2 传输层
文章目录 3. Transport Layer(传输层)3.1 Multiplexing and demultiplexing(多路复用和多路分解)3.2 Connectionless transport:UDP3.3 Principles of reliable data transfer3.4 Pipelined communication3.5 TCP: con…...

git仓库多人协作新建分支 合并到主分支流程详解
在多人协作的 Git 仓库中,新建分支并最终将其合并到主分支的流程是为了实现团队协作、提高代码的可管理性、确保代码质量,并且避免多人同时修改同一部分代码导致冲突。以下是这个流程的目的和具体步骤。 目录 1. 在 master 上新建一个分支 2. 进行功能…...

Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码 【AI辅助开发系列】
🎀🎀🎀【AI辅助编程系列】🎀🎀🎀 Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…...

【时间之外】IT人求职和创业应知【74】-运维机器人
目录 OpenAI最强推理模型o3发布,AGI测试能力暴涨 英伟达宣布收购以色列AI初创企业Runai 汤姆猫首款AI机器人产品明日发售 心勿贪,贵知足。 感谢所有打开这个页面的朋友。人生不如意,开越野车去撒野,会害了自己,不如…...

高阶:基于Python paddleocr库 提取pdf 文档高亮显示的内容
预览 第1步:理解基本结构和导入必要的库 # 1. 首先导入需要的库 import os # 用于处理文件和路径 import cv2 # 用于图像处理 import numpy as np # 用于数值计算 from paddleocr import PaddleOCR # 用于文字识别 from pdf2image import convert_from_path #…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
Django RBAC项目后端实战 - 03 DRF权限控制实现
项目背景 在上一篇文章中,我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统,为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...

【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题
20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题 2025/6/9 20:54 缘起,为了跨网段推流,千辛万苦配置好了网络参数。 但是命令iptables -t filter -F tetherctrl_FORWARD可以在调试串口/DEBUG口正确执行。…...

OpenHarmony标准系统-HDF框架之I2C驱动开发
文章目录 引言I2C基础知识概念和特性协议,四种信号组合 I2C调试手段硬件软件 HDF框架下的I2C设备驱动案例描述驱动Dispatch驱动读写 总结 引言 I2C基础知识 概念和特性 集成电路总线,由串网12C(1C、12C、Inter-Integrated Circuit BUS)行数据线SDA和串…...