优化文件结构
This commit is contained in:
@@ -0,0 +1,181 @@
|
||||
---
|
||||
title: opencv应用-基础操作
|
||||
categories:
|
||||
- 技术
|
||||
series: opencv
|
||||
tags:
|
||||
- opencv
|
||||
abbrlink: e8f95ead
|
||||
summary: >-
|
||||
这篇文章介绍了使用C++和OpenCV库进行图像处理的基础操作,包括图片的读取与展示、像素的读取与修改、图像的基本变换(缩放、旋转、平移、翻转)、以及图像通道的分离与合并。文章详细讲解了每个操作的代码实现,并展示了如何通过OpenCV库提供的函数来完成这些任务。这对于初学者来说是非常有用的,因为它帮助他们理解如何使用OpenCV进行图像处理。
|
||||
date: 2026-03-15 09:56:51
|
||||
---
|
||||
|
||||
这里用C++进行编程,发现菜鸟教程只有python的版本,那就记录一下。
|
||||
|
||||
# 图片读取与展示
|
||||
|
||||
```cpp
|
||||
// 读取图像
|
||||
#include<opencv2/opencv.hpp>
|
||||
#include<iostream>
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
|
||||
int main(){
|
||||
Mat src = imread("../img/1.png");
|
||||
imshow("input",src);
|
||||
waitKey(0);
|
||||
destroyAllWindows();
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
# 图像基本操作
|
||||
## 读取像素
|
||||
需要用到三维向量数组Vect3b,这里需要注意的是,Opencv是BGR而不是我们常用的RGB。
|
||||
```cpp
|
||||
// 读取像素
|
||||
#include<opencv2/opencv.hpp>
|
||||
#include<iostream>
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
|
||||
int main()
|
||||
{
|
||||
string image_path = "../img/1.png";
|
||||
Mat image = imread(image_path);
|
||||
|
||||
if (image.empty()) {
|
||||
cout << "错误:无法加载图像,请检查路径是否正确。" << endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
Vec3b pixel_value = image.at<Vec3b>(100, 150);
|
||||
|
||||
cout << "B: " << (int)pixel_value[0] << " "
|
||||
<< "G: " << (int)pixel_value[1] << " "
|
||||
<< "R: " << (int)pixel_value[2] << endl;
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
## 修改像素
|
||||
|
||||
```cpp
|
||||
// 修改像素
|
||||
#include<opencv2/opencv.hpp>
|
||||
#include<iostream>
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
|
||||
int main()
|
||||
{
|
||||
string image_path = "../img/1.png";
|
||||
Mat image = imread(image_path);
|
||||
Mat result = image.clone();
|
||||
|
||||
if (image.empty()) {
|
||||
cout << "错误:无法加载图像,请检查路径是否正确。" << endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
Rect roi_rect(0, 0, 100, 100);
|
||||
Mat roi = result(roi_rect);
|
||||
roi.setTo(Scalar(0, 255, 0));
|
||||
imshow("Original (Unchanged)", image);
|
||||
imshow("Modified Copy", result);
|
||||
waitKey(0);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
```cpp
|
||||
#include <opencv2/opencv.hpp>
|
||||
#include <iostream>
|
||||
|
||||
int main() {
|
||||
// 读取图像
|
||||
cv::Mat img = cv::imread("../img/1.png");
|
||||
if (img.empty()) {
|
||||
std::cout << "无法读取图像" << std::endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 1. 缩放
|
||||
cv::Mat resized_img;
|
||||
cv::resize(img, resized_img, cv::Size(200, 200));
|
||||
cv::imshow("resized_img", resized_img);
|
||||
|
||||
// 2. 旋转
|
||||
cv::Mat rotated_img, M_rot;
|
||||
cv::Point2f center(img.cols / 2.0, img.rows / 2.0);
|
||||
M_rot = cv::getRotationMatrix2D(center, 45, 1.0);
|
||||
cv::warpAffine(img, rotated_img, M_rot, img.size());
|
||||
cv::imshow("rotated_img", rotated_img);
|
||||
|
||||
// 3. 平移
|
||||
cv::Mat translated_img;
|
||||
cv::Mat M_trans = (cv::Mat_<float>(2, 3) << 1, 0, 100, 0, 1, 50);
|
||||
cv::warpAffine(img, translated_img, M_trans, img.size());
|
||||
cv::imshow("translated_img", translated_img);
|
||||
|
||||
// 4. 翻转
|
||||
cv::Mat flipped_img;
|
||||
cv::flip(img, flipped_img, 1);
|
||||
cv::imshow("flipped", flipped_img);
|
||||
|
||||
// 显示结果
|
||||
cv::imshow("Original", img);
|
||||
cv::waitKey(0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
```cpp
|
||||
// 图像通道分离与合并
|
||||
#include<opencv2/opencv.hpp>
|
||||
#include<iostream>
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
|
||||
int main()
|
||||
{
|
||||
string image_path = "../img/1.png";
|
||||
Mat image = imread(image_path);
|
||||
Mat result = image.clone();
|
||||
// 定义向量数组接收通道
|
||||
vector<Mat> channels;
|
||||
// 拆分
|
||||
split(result,channels);
|
||||
|
||||
Mat b = channels[0];
|
||||
Mat g = channels[1];
|
||||
Mat r = channels[2];
|
||||
|
||||
imshow("Blue Channel (Grayscale)", channels[0]);
|
||||
imshow("Green Channel (Grayscale)", channels[1]);
|
||||
imshow("Red Channel (Grayscale)", channels[2]);
|
||||
|
||||
// merge
|
||||
Mat merged_img;
|
||||
vector<cv::Mat> channels_to_merge;
|
||||
channels_to_merge.push_back(b);
|
||||
channels_to_merge.push_back(g);
|
||||
channels_to_merge.push_back(r);
|
||||
|
||||
merge(channels_to_merge, merged_img);
|
||||
imshow("merged",merged_img);
|
||||
|
||||
waitKey(0);
|
||||
|
||||
return(0);
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,70 @@
|
||||
---
|
||||
title: opencv应用-算术运算
|
||||
categories:
|
||||
- 技术
|
||||
series: opencv
|
||||
tags:
|
||||
- opencv
|
||||
abbrlink: b559997d
|
||||
summary: >-
|
||||
这篇文章介绍了如何使用OpenCV进行图像的加法运算。首先,通过包含OpenCV和iostream头文件,并使用std命名空间,开始编写代码。主函数中,读取两张图片,检查是否成功加载,并确保它们的尺寸相同。如果尺寸不同,将第二张图片调整为与第一张相同的大小。然后,调用add函数对两幅图片进行加法运算,并将结果存储在result矩阵中。最后,显示原始图片和加法运算的结果,并等待按键关闭窗口。代码已上传至自建的git仓库。
|
||||
date: 2026-03-17 13:13:08
|
||||
---
|
||||
|
||||
opencv对图像的算数运算,感觉都大同小异,分为以下几种:加减乘除和位运算。
|
||||
|
||||
| 函数 | 功能 | 应用场景 |
|
||||
|-------------------|--------|------------|
|
||||
| cv2.bitwise_and() | 按位与操作 | 掩码操作、图像分割 |
|
||||
| cv2.bitwise_or() | 按位或操作 | 图像叠加 |
|
||||
| cv2.bitwise_not() | 按位取反操作 | 图像反色 |
|
||||
| cv2.bitwise_xor() | 按位异或操作 | 图像差异检测 |
|
||||
|
||||
因为感觉都差不多,所以只把加法运算代码搬过来
|
||||
|
||||
```cpp
|
||||
// 加法
|
||||
#include <opencv2/opencv.hpp>
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
|
||||
int main()
|
||||
{
|
||||
string path1 = "../img/2.jpg";
|
||||
string path2 = "../img/3.jpg";
|
||||
|
||||
Mat img1 = imread(path1);
|
||||
Mat img2 = imread(path2);
|
||||
|
||||
if (img1.empty() || img2.empty())
|
||||
{
|
||||
cout << "无法读取图片,请检查路径!" << endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (img1.size() != img2.size())
|
||||
{
|
||||
cout << "尺寸不一致,正在自动调整 img2 的尺寸..." << endl;
|
||||
// 将 img2 缩放到与 img1 相同的尺寸
|
||||
resize(img2, img2, img1.size());
|
||||
}
|
||||
|
||||
Mat result;
|
||||
add(img1, img2, result);
|
||||
|
||||
imshow("Original Image 1", img1);
|
||||
imshow("Original Image 2", img2);
|
||||
imshow("Add Result", result);
|
||||
|
||||
// 等待按键后关闭窗口
|
||||
waitKey(0);
|
||||
destroyAllWindows();
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
另外,把代码上传到了自建的git中
|
||||
{% link opencv-learning,opencv-learning,https://git.biss.click/biss/opencv-learning/src/branch/master/Arithmetic%20operations %}
|
||||
@@ -0,0 +1,50 @@
|
||||
---
|
||||
title: 配置opencv
|
||||
cover: https://pic.biss.click/image/c177a2e2-63af-4582-98b6-e95726f6cdc5.webp
|
||||
categories:
|
||||
- 技术
|
||||
series: opencv
|
||||
tags: opencv
|
||||
abbrlink: 6e3332b
|
||||
summary: >-
|
||||
这篇文章介绍了在Ubuntu和Windows系统上配置OpenCV的过程。在Ubuntu系统中,通过包管理器安装了Visual
|
||||
Studio、GCC、G++、OpenCV以及Python的OpenCV绑定。而在Windows系统中,则通过安装Visual
|
||||
Studio并下载OpenCV的Windows安装包进行配置,包括将安装路径添加到系统环境变量中。
|
||||
date: 2026-03-14 11:48:36
|
||||
---
|
||||
|
||||
# 引言
|
||||
不知道为什么我们专业看起来与计算机八竿子打不着,竟然要学`opencv`,那就来记录一下吧!
|
||||
# Ubuntu 篇
|
||||
|
||||
`Ubuntu`因为有完善的包管理体系,所以配环境相对简单。
|
||||
|
||||
先安装`vscode`,当然也可以不安装,只是个编辑器;
|
||||
{% link vscode,Microsoft,https://code.visualstudio.com/ %}
|
||||
到这里下载`deb`格式的软件包,然后`dpkg`安装即可。可以安装这些扩展:
|
||||
|
||||
<center><img src=https://pic.biss.click/image/3369ff6a-3286-4ccd-b261-a38802f7d9f2.webp)></center>
|
||||
|
||||
接下来安装编译器
|
||||
|
||||
```bash
|
||||
# 先更新软件包
|
||||
apt update
|
||||
apt upgrade -y
|
||||
# 安装C/C++编译器
|
||||
apt install gcc g++
|
||||
# 安装opencv
|
||||
apt install -y mesa-utils
|
||||
apt install -y libopencv-dev
|
||||
apt install -y opencv
|
||||
apt install -y python3-opencv #Python opencv
|
||||
```
|
||||
然后就可以了。
|
||||
|
||||
# Windows 篇
|
||||
`Windows` 下需要安装`Visual Studio`,比较简单,官网下载安装就行。选择使用C++桌面开发就行。
|
||||
下载`opencv`,在下边网站下载`Windows`安装包,
|
||||
{% link opencv,opencv,https://opencv.org/releases/ %}
|
||||
下载后是一个自解压包,解压路径设置成自己想要的路径,
|
||||
把安装路径添加到系统环境变量中,例如`D:\Opencv\opencv\build\x64\vc16\bin`
|
||||
然后应该就没问题了。
|
||||
Reference in New Issue
Block a user