【机器学习】OpenCV入门与基础知识
🌈个人主页: 鑫宝Code
🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础
💫个人格言: "如无必要,勿增实体"
文章目录
- OpenCV入门与基础知识
- 简介
- 安装与环境配置
- Windows
- Linux
- macOS
- 核心数据结构
- Mat
- Scalar
- Point
- Rect
- 基本图像操作
- 读写图像
- 显示图像
- 几何变换
- 颜色空间转换
- 基本绘图操作
- 绘制线条
- 绘制矩形
- 绘制圆形
- 绘制文本
- 核心函数
- 滤波
- 图像混合
- 位操作
- 其他函数
- 总结
OpenCV入门与基础知识
简介
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它由Intel公司发起并参与管理。OpenCV提供了一系列用于图像处理和计算机视觉的算法和工具,支持多种编程语言,如C++、Python、Java等,并且可以运行在Windows、Linux、macOS等多种操作系统上。
OpenCV广泛应用于各个领域,包括人机交互、机器人、安防监控、医疗影像、汽车驾驶等。它提供了丰富的功能,涵盖图像处理、视频分析、目标检测与跟踪、3D视觉等多个方面。

安装与环境配置
Windows
在Windows系统上安装OpenCV,可以通过预编译好的安装包进行安装。您可以从OpenCV官网(https://opencv.org/releases/)下载适合您系统的安装包,然后按照提示一步步安装。
安装完成后,您需要配置环境变量,以便在代码中引用OpenCV库。具体步骤如下:
- 右键点击"计算机"或"此电脑",选择"属性"。
- 点击"高级系统设置"。
- 点击"环境变量"。
- 在"系统变量"中,找到"Path"变量,点击"编辑"。
- 点击"新建",输入OpenCV安装路径下的
\build\x64\vc15\bin(具体路径根据您的安装版本而定)。 - 点击"确定"保存更改。
Linux
在Linux系统上安装OpenCV,可以通过包管理器进行安装。以Ubuntu为例,您可以在终端中执行以下命令:
sudo apt-get update
sudo apt-get install libopencv-dev
这将安装OpenCV及其依赖项。如果您需要特定版本的OpenCV,可以从源码编译安装。
macOS
在macOS系统上安装OpenCV,可以使用Homebrew包管理器。在终端中执行以下命令:
brew install opencv
这将安装最新版本的OpenCV。如果您需要特定版本,可以指定版本号,例如:
brew install opencv@4
核心数据结构
OpenCV提供了一些核心数据结构,用于存储和处理图像、视频和其他数据。以下是一些常用的数据结构:
Mat
Mat是OpenCV中最重要的数据结构,用于存储图像数据。它是一个二维或多维的密集数组,可以存储不同类型的数据,如CV_8UC1(8位无符号单通道)、CV_32FC3(32位浮点三通道)等。
// 创建一个3通道的512x512的8位无符号整型矩阵
cv::Mat image = cv::Mat::zeros(512, 512, CV_8UC3);

Scalar
Scalar是一个四元数据结构,通常用于表示颜色或像素值。它包含四个元素,分别对应蓝色、绿色、红色和Alpha通道。
// 创建一个蓝色的Scalar
cv::Scalar blue(255, 0, 0);
Point
Point是一个二维点的数据结构,用于表示图像或视频中的坐标。它包含两个元素,分别表示x和y坐标。
// 创建一个点(10, 20)
cv::Point pt(10, 20);
Rect
Rect是一个矩形的数据结构,用于表示图像或视频中的矩形区域。它包含四个元素,分别表示矩形的x、y坐标、宽度和高度。
// 创建一个矩形(10, 20, 100, 200)
cv::Rect rect(10, 20, 100, 200);
基本图像操作

读写图像
OpenCV提供了imread()和imwrite()函数,用于读取和写入图像文件。
#include <opencv2/opencv.hpp>int main()
{// 读取图像cv::Mat image = cv::imread("image.jpg");// 显示图像cv::imshow("Image", image);cv::waitKey(0);// 写入图像cv::imwrite("output.png", image);return 0;
}
显示图像
OpenCV提供了imshow()函数,用于在窗口中显示图像。
#include <opencv2/opencv.hpp>int main()
{cv::Mat image = cv::imread("image.jpg");// 显示图像cv::imshow("Image", image);cv::waitKey(0);return 0;
}
几何变换
OpenCV提供了多种几何变换函数,如resize()、rotate()、warpAffine()等,用于调整图像的大小、旋转、平移等操作。
#include <opencv2/opencv.hpp>int main()
{cv::Mat image = cv::imread("image.jpg");// 调整图像大小cv::resize(image, image, cv::Size(800, 600));// 旋转图像cv::Point2f center(image.cols / 2.0, image.rows / 2.0);cv::Mat rotation_matrix = cv::getRotationMatrix2D(center, 45, 1.0);cv::warpAffine(image, image, rotation_matrix, image.size());cv::imshow("Image", image);cv::waitKey(0);return 0;
}
颜色空间转换
OpenCV支持多种颜色空间,如BGR、HSV、Gray等。您可以使用cvtColor()函数在不同颜色空间之间转换。
#include <opencv2/opencv.hpp>int main()
{cv::Mat image = cv::imread("image.jpg");// 转换为灰度图像cv::Mat gray;cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);cv::imshow("Gray", gray);cv::waitKey(0);return 0;
}
基本绘图操作
OpenCV提供了一些基本的绘图函数,用于在图像上绘制线条、矩形、圆形、文本等。
绘制线条
使用line()函数可以在图像上绘制线条。
#include <opencv2/opencv.hpp>int main()
{cv::Mat image = cv::Mat::zeros(500, 500, CV_8UC3);// 绘制线条cv::line(image, cv::Point(100, 100), cv::Point(400, 400), cv::Scalar(0, 0, 255), 3);cv::imshow("Image", image);cv::waitKey(0);return 0;
}
绘制矩形
使用rectangle()函数可以在图像上绘制矩形。
#include <opencv2/opencv.hpp>int main()
{cv::Mat image = cv::Mat::zeros(500, 500, CV_8UC3);// 绘制矩形cv::rectangle(image, cv::Point(100, 100), cv::Point(400, 400), cv::Scalar(0, 255, 0), 2);cv::imshow("Image", image);cv::waitKey(0);return 0;
}
绘制圆形
使用circle()函数可以在图像上绘制圆形。
#include <opencv2/opencv.hpp>int main()
{cv::Mat image = cv::Mat::zeros(500, 500, CV_8UC3);// 绘制圆形cv::circle(image, cv::Point(250, 250), 100, cv::Scalar(255, 0, 0), -1);cv::imshow("Image", image);cv::waitKey(0);return 0;
}
绘制文本
使用putText()函数可以在图像上绘制文本。
#include <opencv2/opencv.hpp>int main()
{cv::Mat image = cv::Mat::zeros(500, 500, CV_8UC3);// 绘制文本cv::putText(image, "Hello, OpenCV!", cv::Point(100, 100), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(255, 255, 255), 2);cv::imshow("Image", image);cv::waitKey(0);return 0;
}
核心函数
OpenCV提供了许多核心函数,用于执行各种图像处理和计算机视觉任务。以下是一些常用的核心函数:
滤波
OpenCV提供了多种滤波函数,用于对图像进行平滑、锐化、边缘检测等操作。常用的滤波函数包括blur()、GaussianBlur()、medianBlur()、Laplacian()、Sobel()等。
#include <opencv2/opencv.hpp>int main()
{cv::Mat image = cv::imread("image.jpg");// 高斯滤波cv::Mat blurred;cv::GaussianBlur(image, blurred, cv::Size(5, 5), 0);cv::imshow("Blurred", blurred);cv::waitKey(0);return 0;
}
图像混合
OpenCV提供了addWeighted()函数,用于将两个图像进行线性混合。这在图像拼接、alpha混合等场景中非常有用。
#include <opencv2/opencv.hpp>int main()
{cv::Mat image1 = cv::imread("image1.jpg");cv::Mat image2 = cv::imread("image2.jpg");// 图像混合double alpha = 0.5;double beta = 1.0 - alpha;cv::Mat blended;cv::addWeighted(image1, alpha, image2, beta, 0.0, blended);cv::imshow("Blended", blended);cv::waitKey(0);return 0;
}
位操作
OpenCV提供了一些位操作函数,如bitwise_and()、bitwise_or()、bitwise_xor()和bitwise_not()。这些函数可用于执行像素级别的操作,如图像遮罩、背景移除等。
#include <opencv2/opencv.hpp>int main()
{cv::Mat image = cv::imread("image.jpg");cv::Mat mask = cv::imread("mask.jpg", cv::IMREAD_GRAYSCALE);// 位操作cv::Mat masked;cv::bitwise_and(image, image, masked, mask);cv::imshow("Masked", masked);cv::waitKey(0);return 0;
}
其他函数
OpenCV还提供了许多其他有用的函数,如calcHist()用于计算直方图、findContours()用于查找轮廓、matchTemplate()用于模板匹配等。这些函数可以帮助您完成各种图像处理和计算机视觉任务。
总结
本文介绍了OpenCV的基本概念、安装配置、核心数据结构、基本图像操作、绘图操作和核心函数。通过学习这些基础知识,您将能够开始使用OpenCV进行图像处理和计算机视觉应用的开发。在后续的文章中,我们将深入探讨OpenCV在高级图像处理和计算机视觉应用中的使用。
相关文章:
【机器学习】OpenCV入门与基础知识
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 OpenCV入门与基础知识简介安装与环境配置WindowsLinuxmacOS 核心数据结构MatSca…...
JUC学习笔记(二)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 四、共享模型之内存4.1 Java 内存模型4.2 可见性退不出的循环解决方法可见性 vs 原子性模式之 Balking1.定义2.实现 4.3 有序性原理之指令级并行1. 名词2.鱼罐头的故…...
炫酷HTML蜘蛛侠登录页面
全篇使用HTML、CSS、JavaScript,建议有过基础的进行阅读。 一、预览图 二、HTML代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-w…...
算法里面的离散化
一、离散化(discretization)在算法和数据结构中指的是将连续的输入数据映射到离散的值或者范围,从而使得处理和计算变得更高效。通常用于处理大范围或者无限可能的输入,以便将其转化为有限的、可以有效处理的范围。 离散化的定义…...
Https AK--(ssl 安全感满满)
免责声明:本文仅做分享! 目录 https探测 openssl Openssl连接服务器获取基本信息 连接命令: 指定算法连接: 测试弱协议连接是否可以连接: 得到的内容包括: sslscan 在线查询证书 https AK type 中间人AK sslsplit 工具…...
ERROR: Failed building wheel for cython_bbox | pip install cython_bbox 失败【解决方案】
🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 win11 系统 pip3 install cython_bbox 失败报错如下解决方法:1 下载…...
逻辑与位运算的双面舞者:、、|、||深度解析
深入解析&、&&、|、||:逻辑与位运算的奥秘之旅 在编程的世界里,&、&&、|、||这四种运算符扮演着至关重要的角色。它们不仅仅是简单的符号,更是连接程序逻辑、实现复杂功能的桥梁。本文旨在深入探讨这四者的区别与联…...
中断门+陷阱门
中断门: 中断描述符在IDT表里面 kd> dq idtr 80b95400 83e48e000008bfc0 83e48e000008c150 80b95410 0000850000580000 83e4ee000008c5c0 80b95420 83e4ee000008c748 83e48e000008c8a8 80b95430 83e48e000008ca1c 83e48e000008d018 80b95440 000085000050…...
RTMP直播播放器的几种选择
如何选择RTMP播放器? 在选择RTMP播放器时,需要综合考虑多个因素,以确保选择的播放器能够满足实际需求并提供良好的用户体验。以下是一些选择RTMP播放器的建议: 1. 功能需求 低延迟:对于直播场景,低延迟是…...
初识爬虫1
学习路线:爬虫基础知识-requests模块-数据提取-selenium-反爬与反反爬-MongoDB数据库-scrapy-appium。 对应视频链接(百度网盘):正在整理中 爬虫基础知识: 1.爬虫的概念 总结:模拟浏览器,发送请求,获取…...
【趣学Python算法100例】兔子产子
问题描述 有一对兔子,从出生后的第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子,假设所有的兔子都不死,问30个月内每个月的兔子总对数为多少? 题目解析 兔子产子问题是一个有趣的古典数学问题,…...
HTTP 四、HttpClient的使用
一、简单介绍 1、简介 HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著…...
C语言:结构体变量
1. 结构体变量的引用方法 例如,若有数据定义: struct Student{char name[10];int age;struct Date birthday; }s1,s2,stu[10]; 则下面对结构体变量的引用都是正确的: s1.age20; scanf("%d",&s1.age); gets(stu[0].name); s…...
bibtex是什么
BibTeX 是一个用于处理和格式化参考文献的工具,常与 LaTeX 一起使用。它提供了一种方便的方式来管理和生成参考文献列表,特别适用于学术写作和科研论文中。以下是对 BibTeX 的详细介绍: 基本概念 BibTeX 是 LaTeX 的一个附加工具࿰…...
【大模型专栏—进阶篇】智能对话全总结
大模型专栏介绍 😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本文为大模型专栏子篇,大模型专栏将持续更新,主要讲解大模型从入门到实战打怪升级。如有兴趣,欢迎您的阅读。 Ǵ…...
MVC应用单元测试以及请求参数的验证
SpringMVC支持对Controller单元测试 RunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(locations {"classpath:mvc-dispatcher-servlet.xml", }) WebAppConfiguration public class ControllerJUnitBase{Resourceprivate RequestMappingHandlerMappin…...
算法:TopK问题
题目 有10亿个数字,需要找出其中的前k大个数字。 为了方便讲解,这里令k为5。 思路分析(以找前k大个数字为例) 很容易想到,进行排序,然后取前k个数字即可。 但是,难点在于,10亿个数…...
.json文件的C#解析,基于Newtonsoft.Json插件
目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 2.2.3 测试结果 3. 备注 1. 前言 天气晚来秋,这几天天气变凉了,各位同学注意好多穿衣服。回归正题 由于需要,需要将json的配置里面的调理解析出来,做成接口,以便于开发。 2. 正文 2.1 …...
四、(JS)JS中常见的加载事件
一、文档加载监听 (1)抛出疑惑,什么是文档加载监听?为什么要有这个东西? 老样子,我们先讲一个场景,带着大家熟悉为什么会有文档加载监听,是来解决什么问题来着的。 我们先看下这段…...
[网络]https的概念及加密过程
文章目录 一. HTTPS二. https加密过程 一. HTTPS https本质上就是http的基础上增加了一个加密层, 抛开加密之后, 剩下的就是个http是一样的 s > SSL HTTPS HTTP SSL 这个过程, 涉及到密码学的几个核心概念 明文 要传输的真正意思是啥 2)密文 加密之后得到的数据 这个密文…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
背包问题双雄:01 背包与完全背包详解(Java 实现)
一、背包问题概述 背包问题是动态规划领域的经典问题,其核心在于如何在有限容量的背包中选择物品,使得总价值最大化。根据物品选择规则的不同,主要分为两类: 01 背包:每件物品最多选 1 次(选或不选&#…...
高保真组件库:开关
一:制作关状态 拖入一个矩形作为关闭的底色:44 x 22,填充灰色CCCCCC,圆角23,边框宽度0,文本为”关“,右对齐,边距2,2,6,2,文本颜色白色FFFFFF。 拖拽一个椭圆,尺寸18 x 18,边框为0。3. 全选转为动态面板状态1命名为”关“。 二:制作开状态 复制关状态并命名为”开…...
