使用C++结合OpenCV进行图像处理与分类

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。
如果觉得本文能帮到您,麻烦点个赞👍呗!

近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️
Qt5.9专栏定期更新Qt的一些项目Demo
项目与比赛专栏定期更新比赛的一些心得面试项目常被问到的知识点。

在这里插入图片描述

一、引言

在当今数字化时代,图像处理技术在各个领域得到了广泛应用。无论是自动驾驶、医学影像分析,还是安防监控、虚拟现实,图像处理都扮演着重要角色。OpenCV(Open Source Computer Vision Library)作为一个开源的计算机视觉库,提供了丰富的图像处理函数和工具,使得图像处理变得更加简单和高效。本文将介绍如何使用C++结合OpenCV进行基础的图像处理操作。
在这里插入图片描述
在C++领域中,openCV同时也是使用yolo的必备配置环境。
结合yolo可以完成图像分类和目标检测
除了进行目标检测,也可以将这个应用在图像分类中。
使用C++实现YOLO图像分类:从环境搭建到性能评估的完整指南
在这里插入图片描述
在这里插入图片描述

模型的图像分类的流程:

  • 加载图像:从文件系统或其他来源加载图像数据。 预处理图像:对图像进行预处理操作,如缩放、归一化、去噪等,以便于后续处理。
  • 特征提取:从图像中提取有意义的特征,如边缘、纹理、形状等。常用的方法包括SIFT、SURF、ORB等。
  • 处理:对提取的特征进行处理,如特征选择、特征缩放等,以减少维度和提高分类器的性能。
  • 加载分类器模型:加载预先训练好的分类器模型,如支持向量机(SVM)、神经网络、随机森林等。
  • 进行分类:使用分类器对处理后的特征进行分类,得到图像的类别。 输出分类结果:将分类结果输出或展示。

在这里插入图片描述

二、 安装OpenCV

Windows系统详细的环境安装,可以参考我之前写的这一篇文章。
VS2019中配置C++ OpenCV 4.5.4完整指南

在使用OpenCV之前,我们需要先在开发环境中安装OpenCV库。以下是Windows和Ubuntu系统中安装OpenCV的基本步骤:

1. Windows系统:

  1. 下载OpenCV安装包:OpenCV官网
  2. 解压安装包到指定目录。
  3. 配置环境变量,将OpenCV的bin目录添加到系统的PATH中。
  4. 在C++项目中添加OpenCV库的包含路径和库文件路径。

2. Ubuntu系统:

sudo apt update
sudo apt install libopencv-dev

三、 图像读取与显示

在这里插入图片描述

首先,我们来看一个简单的图像读取与显示的示例程序:

#include <opencv2/opencv.hpp>
#include <iostream>int main() {// 读取图像cv::Mat image = cv::imread("example.jpg");// 检查图像是否读取成功if(image.empty()) {std::cout << "无法打开图像文件" << std::endl;return -1;}// 显示图像cv::imshow("Display Image", image);cv::waitKey(0); // 等待按键按下return 0;
}

在这个示例中,我们使用cv::imread函数读取一张图像,并使用cv::imshow函数显示图像。cv::waitKey(0)函数用于等待用户按键,以便窗口不会立即关闭。

四、 图像预处理

图像预处理是图像处理中的重要步骤,包括图像的灰度化、二值化、平滑处理等。以下是一个简单的图像预处理示例:

#include <opencv2/opencv.hpp>
#include <iostream>int main() {cv::Mat image = cv::imread("example.jpg", cv::IMREAD_GRAYSCALE); // 读取灰度图像if(image.empty()) {std::cout << "无法打开图像文件" << std::endl;return -1;}cv::Mat blurredImage;cv::GaussianBlur(image, blurredImage, cv::Size(5, 5), 1.5); // 高斯模糊处理cv::imshow("Original Image", image);cv::imshow("Blurred Image", blurredImage);cv::waitKey(0);return 0;
}

在这个示例中,我们使用cv::imread函数以灰度模式读取图像,并使用cv::GaussianBlur函数对图像进行高斯模糊处理。

五、图像形状检测

OpenCV还提供了丰富的形状检测功能,例如边缘检测和轮廓检测。以下是一个简单的边缘检测示例:

#include <opencv2/opencv.hpp>
#include <iostream>int main() {cv::Mat image = cv::imread("example.jpg", cv::IMREAD_GRAYSCALE);if(image.empty()) {std::cout << "无法打开图像文件" << std::endl;return -1;}cv::Mat edges;cv::Canny(image, edges, 50, 150); // Canny边缘检测cv::imshow("Edges", edges);cv::waitKey(0);return 0;
}

在这个示例中,我们使用cv::Canny函数进行边缘检测,并显示结果图像。

六、图像分类

图像分类是计算机视觉中的重要任务,常用于自动驾驶、安防监控、医疗诊断等领域。通过对图像内容进行分类,我们可以实现对不同类别物体的识别和区分。

1.1 使用Bag of Words (BOW)算法进行图像分类

Bag of Words (BOW)算法是一种经典的图像分类方法,通过将图像表示为特征词袋进行分类。下面是使用OpenCV和C++实现BOW算法进行图像分类的示例代码。

1.2 环境准备

首先,确保已安装OpenCV库,并配置好C++开发环境。需要安装额外的库如opencv_contrib,以便使用BOW相关模块。

1.3 示例代码

以下是实现BOW算法进行图像分类的代码:

#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/ml.hpp>
#include <iostream>
#include <vector>using namespace cv;
using namespace cv::ml;
using namespace std;
using namespace cv::xfeatures2d;void extractFeatures(const vector<string>& imagePaths, vector<Mat>& features, Ptr<SIFT> detector) {for (const auto& path : imagePaths) {Mat image = imread(path, IMREAD_GRAYSCALE);vector<KeyPoint> keypoints;Mat descriptors;detector->detectAndCompute(image, noArray(), keypoints, descriptors);features.push_back(descriptors);}
}int main() {// 图像路径vector<string> trainImages = {"image1.jpg", "image2.jpg", "image3.jpg"};vector<string> testImages = {"test1.jpg", "test2.jpg"};// 创建SIFT特征检测器Ptr<SIFT> detector = SIFT::create();// 提取训练集特征vector<Mat> trainFeatures;extractFeatures(trainImages, trainFeatures, detector);// 聚类,创建词典BOWKMeansTrainer bowTrainer(100); // 词典大小for (const auto& feature : trainFeatures) {bowTrainer.add(feature);}Mat dictionary = bowTrainer.cluster();// 创建BOW图像描述器Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("FlannBased");BOWImgDescriptorExtractor bowDE(detector, matcher);bowDE.setVocabulary(dictionary);// 训练分类器Ptr<SVM> svm = SVM::create();Mat trainData, labels;for (size_t i = 0; i < trainImages.size(); ++i) {Mat bowDescriptor;bowDE.compute(imread(trainImages[i], IMREAD_GRAYSCALE), bowDescriptor);trainData.push_back(bowDescriptor);labels.push_back((float)i); // 假设每个图像都有不同的标签}svm->train(trainData, ROW_SAMPLE, labels);// 测试分类器for (const auto& path : testImages) {Mat testImage = imread(path, IMREAD_GRAYSCALE);Mat bowDescriptor;bowDE.compute(testImage, bowDescriptor);float response = svm->predict(bowDescriptor);cout << "Image: " << path << " classified as: " << response << endl;}return 0;
}

result

Image: test1.jpg classified as: 0
Image: test2.jpg classified as: 1

七、适合图像分类的优秀的仓库

我可以为您提供一些图片的链接,您可以使用这些图片作为博客中的例子。以下是一些公共领域图片资源网站的链接,您可以从这些网站下载适合用于图像分类任务的图片:

  1. Pixabay - 提供大量免费图片,适用于个人和商业用途。

    • 链接: Pixabay
  2. Unsplash - 一个提供高分辨率照片的平台,所有照片均可免费使用。

    • 链接: Unsplash
  3. Pexels - 提供免费且高质量的图片,可用于商业用途,无需署名。

    • 链接: Pexels
  4. Open Images Dataset - Google 提供的一个大规模图片数据集,可用于图像识别和分类。

    • 链接: Open Images Dataset
      在这里插入图片描述
  5. MNIST Database - 手写数字的图片数据集,常用于图像分类和机器学习任务。

    • 链接: MNIST Database
      在这里插入图片描述
      在这里插入图片描述
  6. CIFAR-10 and CIFAR-100 - 包含多种类别的图片数据集,适用于图像分类。

    • 链接: CIFAR-10/CIFAR-100
  7. ImageNet - 一个非常大的图像数据库,用于视觉对象识别研究。

    • 链接: ImageNet
  8. Flickr - 通过Flickr的Creative Commons搜索,您可以找到许多可用于非商业或商业用途的图片。

    • 链接: Flickr Creative Commons
  9. Getty Images - 虽然Getty Images主要是版权图片,但它们也提供了一些免费图片的集合。

    • 链接: Getty Images
  10. NASA Image and Video Library - NASA提供的图片和视频资源,适合用于科学和教育目的。

    • 链接: NASA Image and Video Library

请注意,使用图片时,您应遵守每个网站的使用条款和版权信息。对于商业用途,建议仔细检查图片的许可证,确保合法使用。

八、 结论

通过以上步骤,我们使用C++和OpenCV实现了基于BOW算法的图像分类。本文介绍了从特征提取、词典创建到模型训练和分类的全过程。这仅仅是图像分类的入门,OpenCV还支持更多复杂的算法和深度学习模型,读者可以进一步探索,以便在实际项目中更好地应用这些技术。希望本文对您在学习和应用图像分类技术方面有所帮助。

最后,最后
如果觉得有用,麻烦三连👍⭐️❤️支持一下呀,希望这篇文章可以帮到你,你的点赞是我持续更新的动力

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

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

相关文章

基于STC12C5A60S2系列1T 8051单片机实现串口调试助手软件与单片机相互发送数据的RS485通信功能

基于STC12C5A60S2系列1T 8051单片机实现串口调试助手软件与单片机相互发送数据的RS485通信功能 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片机串口通信的特殊功…

力扣 74.搜索二维矩阵

题目描述&#xff1a; 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&am…

MySQL和MariaDB的对比和选型

目录 1 基本介绍 2 功能对比 3 性能对比 4 兼容性 5 社区支持和发展 6 安全性 7 选择建议 8 结论 除去功能本身的对比&#xff0c;相应各位看官不一定能看出太大所以然&#xff0c;而且对于大部分同学来说&#xff0c;使用起来感觉应该差不多。 所以综合来说&#xff0…

决策树Decision Tree

目录 一、介绍发展优点缺点基本原理 二、熵1、熵2、条件熵3、信息增益4、信息增益率 三、基尼系数四、ID3算法1、建树过程2、优点3、缺点 五、C4.51、二分法处理连续变量1、流程&#xff1a;2、示例 2、缺点 六、CART1、连续数据处理2、离散数据处理3、CART回归原理1、均方误差…

定时器更新界面,线程报错

项目场景&#xff1a; 在javafx框架下使用线程更新UI的时候&#xff0c;出现无法正常更新UI。 问题代码如下&#xff1a; package clock;import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Timer; import java.util.TimerTask;import javaf…

【机器学习】机器学习引领AI:重塑人类社会的新纪元

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀机器学习引领AI &#x1f4d2;1. 引言&#x1f4d5;2. 人工智能&#xff08;AI&#xff09;&#x1f308;人工智能的发展&#x1f31e;应用领…

每日两题6

文章目录 删除并获得点数粉刷房子 删除并获得点数 分析 class Solution { public:int deleteAndEarn(vector<int>& nums) {const int N 10001;// 预处理int arr[N] {0};for (int& e : nums)arr[e] e;// 在 arr 上进行 打家劫舍 问题vector<int> f(N),…

【Python机器学习】NMF——模拟数据

与使用PCA不同&#xff0c;我们需要保证数据是正的&#xff0c;NMF能够对数据进行操作。这说明数据相对于原点(0,0)的位置实际上对NMF很重要。因此&#xff0c;可以将提取出来的非负向量看作是从(0,0)到数据的方向。 举例&#xff1a;NMF在二维玩具数据上的结果&#xff1a; …

基于fegin远程调用的重试功能

前言 在微服务场景中,可能因为系统中网络抖动,导致调用超时或者失败, 按照我们分布式事务角度来看的话, 如果我们在业务中只调用了一次远程的服务查询(只去查询用户服务的某个信息),如果查询失败, 从而导致整个业务回滚, 这种代价是我们不想看到,所以我们就可以基于fegin的远程…

FreeRTOS基础(十二):信号量

本篇博客&#xff0c;我们详细介绍另一个重要的应用&#xff0c;信号量。 目录 一、信号量的简介 1.0 举例理解 1.1 FreeRTOS中的应用 1.2 队列与信号量的对比 二、二值信号量 2.1 二值信号量的概念 2.2 二值信号量的API函数接口 2.2.1 使用二值信号量的过程 2.2.2 …

PDF转图片工具

背景&#xff1a; 今天有个朋友找我&#xff1a;“我有个文件需要更改&#xff0c;但是文档是PDF的&#xff0c;需要你帮我改下内容&#xff0c;你是搞软件的&#xff0c;这个对你应该是轻车熟路了吧&#xff0c;帮我弄弄吧”&#xff0c;听到这话我本想反驳&#xff0c;我是开…

IT闲谈-IMD是什么,有什么优势

目录 一、引言二、IDM是什么&#xff1f;三、IDM的优势1. 高速下载2. 稳定性强3. 强大的任务管理4. 视频下载5. 浏览器整合 四、应用场景1. 商务办公2. 教育学习3. 娱乐休闲 总结 一、引言 在数字化时代&#xff0c;下载管理器已成为我们日常工作和生活中不可或缺的工具。而在…

王学岗鸿蒙开发(北向)——————(四、五、六)ArkUi声明式组件

普通组件 1,注意&#xff0c;如上图&#xff0c;build只能有一个根节点 2,Entry表示程序的入口 Component表示自定义的组件 Preview表示可以预览 3&#xff0c;图片存放的地方 4&#xff0c; Image组件最好只给宽度&#xff0c;给了高度又给宽度容易失真。 build() {Row() {/…

normalizing flows vs 直方图规定化

normalizing flows名字的由来 The base density P ( z ) P(z) P(z) is usually defined as a multivariate standard normal (i.e., with mean zero and identity covariance). Hence, the effect of each subsequent inverse layer is to gradually move or “flow” the da…

第十二章:净世山的终极考验

虽然击败了黑袍人&#xff0c;但四人并未有丝毫的松懈。他们深知&#xff0c;净世山的考验远不止如此。果然&#xff0c;随着黑袍人的倒下&#xff0c;整个山顶开始剧烈震动&#xff0c;仿佛有什么东西即将苏醒。“小心&#xff0c;这山顶似乎有变&#xff01;”赵无极大声提醒…

Java——JVM

前言 JVM.即Java虚拟机.用来解释执行Java字节码. 一、JVM中的内存区域划分 JVM其实也是一个进程,进程运行过程中,要从操作系统这里申请一些资源(内存就是其中的典型资源) 这些内存空间,就支撑了后续Java程序的执行. JVM从系统中申请了一大块内存,这一大块内存给Java程序使…

18、关于优化中央企业资产评估管理有关事项的通知

一、加强重大资产评估项目管理 (一)中央企业应当对资产评估项目实施分类管理,综合考虑评估目的、评估标的资产规模、评估标的特点等因素,合理确定本集团重大资产评估项目划分标准,原则上,企业对外并购股权项目应纳入重大资产评估项目。中央企业应当研究制定重大资产评估…

WebSocket首次使用踩坑记录

背景 IOT服务&#xff0c;后台收到信息推送至前端进行实时日志打印。 实现步骤 Springboot版本&#xff1a;2.5.15 1、增加依赖&#xff0c;我的是jdk1.8编写时发现需要用到javax.websocket但是我默认没有的&#xff0c;故此添加第二个依赖&#xff0c;引入javax.websocket。…

折腾日记:如何在Mac上连接Esp32

个人博客地址 最近购买了一块Esp32单片机&#xff0c;在Mac环境上进行开发&#xff0c;并且成功点亮LED灯和连上屏幕&#xff0c;为什么会上手选择Esp32开发板&#xff0c;主要考虑它自带Wi-Fi和蓝牙&#xff0c;单价也不高&#xff0c;就算后面不玩了&#xff0c;也能转成物联…

深度学习:如何静悄悄地改变我们的日常生活

深度学习 深度学习&#xff1a;如何静悄悄地改变我们的日常生活一、消费电子产品智能手机与个人助理娱乐与社交媒体 二、医疗健康三、汽车与交通四、公共安全五、总结 深度学习&#xff1a;如何静悄悄地改变我们的日常生活 在近年来&#xff0c;深度学习技术因其强大的数据处理…