【OpenCV(C++)快速入门】--opencv学习

0 配置环境

配置环境网上很多资料,这里就不赘述了。

笔者使用的是VS2022+opencv4.9.0

测试配置环境

cpp 复制代码
// 打开摄像头样例
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/imgproc/imgproc.hpp>  
#include <opencv2/imgcodecs/imgcodecs.hpp>
#include <opencv2/core/core.hpp>  
using namespace cv;

int main()
{
	VideoCapture cap(0);
	Mat frame;
	while (1)
	{
		cap >> frame;
		imshow("调用摄像头", frame);
		waitKey(30);
	}
	return 0;
}

如果配置正确,会调用电脑摄像头

1 读图片和视频

读图片

cpp 复制代码
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
#include <string>


 images ///
int main()
{
	std::string path = "Resources/test.png";		// 图片路径
	cv::Mat img = cv::imread(path);					// 读数据
	cv::imshow("Image", img);						// 显示数据
	cv::waitKey(0);									// 增加延时,0表示无穷
	return 0;
}

读视频

cpp 复制代码
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
#include <string>


 video ///
// 视频是一系列的图像,因此需要遍历所有的图像/帧,捕获并且显示
int main()
{
	std::string path = "Resources/test_video.mp4";	// 视频路径
	cv::VideoCapture capture(path);
	cv::Mat img;
	while (1)
	{
		capture.read(img);							// 读到img中
		cv::imshow("Vedio", img);					// 显示
		cv::waitKey(20);							// 延时20ms,数值越大,视频越慢
	}
	return 0;
}

读相机

cpp 复制代码
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
#include <string>



 Webcam ///
// 视频是一系列的图像,因此需要遍历所有的图像/帧,捕获并且显示
int main()
{
	cv::VideoCapture capture(0);					// 只有一个相机
	cv::Mat img;
	while (1)
	{
		capture.read(img);							// 读到img中
		cv::imshow("Vedio", img);					// 显示
		cv::waitKey(1);								// 延时1ms,数值越大,视频越慢
	}
	return 0;
}

2 基本函数

cvtColor

cpp 复制代码
// cvt是convert的缩写,将图像从一种颜色空间转换为另一种颜色空间
// 把img转换成imgGray
cv::cvtColor(img, imgGray, cv::COLOR_BGR2GRAY);
  • img:输入图像,这是一个BGR格式的彩色图像。

  • imgGray:输出图像,转换后的灰度图像。

  • cv::COLOR_BGR2GRAY:转换代码,表示将BGR格式的图像转换为灰度图像。

GaussianBlur

高斯模糊处理

cpp 复制代码
// 使用高斯滤波器模糊图像。该函数将源图像与指定的高斯核进行卷积,Size(7,7)是核大小,数字越大越模糊
// 把img模糊成imgBlur
cv::GaussianBlur(img, imgBlur, cv::Size(7, 7), 5, 0);
  • cv::GaussianBlur是OpenCV中的一个函数,用于对图像进行高斯模糊处理。高斯模糊是一种图像处理技术,通过使用高斯核对图像进行卷积,可以有效地减少图像的噪声和细节,使图像变得模糊。

  • 参数解释

    • img:输入图像,这是一个cv::Mat类型的对象,表示要进行高斯模糊处理的图像。

    • imgBlur:输出图像,经过高斯模糊处理后的图像,也是一个cv::Mat类型的对象。

    • cv::Size(7, 7):高斯核的大小,表示高斯核的宽度和高度。这里使用7×7的高斯核。高斯核的大小必须是正奇数,以确保核的中心能够对准图像的每个像素。

    • 5:高斯核的标准差(σ)在X方向上的值。标准差越大,模糊效果越明显。如果设置为0,OpenCV会根据高斯核的大小自动计算标准差。

    • 0:高斯核的标准差(σ)在Y方向上的值。如果设置为0,OpenCV会使用与X方向相同的标准差。

Canny

边缘检测

cpp 复制代码
// 边缘检测,阈值1,2可调,目的:显示更多的边缘,使用模糊的图像
cv::Canny(imgBlur, imgCanny, 25, 75);
  • cv::Canny是OpenCV中的一个函数,用于执行Canny边缘检测算法。Canny边缘检测是一种多步骤的算法,包括高斯模糊、梯度计算、非极大值抑制和双阈值检测等步骤。

  • 参数解释

    • imgBlur:输入图像,这是一个经过高斯模糊处理的cv::Mat类型的对象。高斯模糊处理可以减少图像的噪声,使边缘检测更加准确。

    • imgCanny:输出图像,经过Canny边缘检测后的图像,也是一个cv::Mat类型的对象。输出图像是一个二值图像,边缘部分的像素值为255,非边缘部分的像素值为0。

    • 25:低阈值(threshold1),用于Canny边缘检测中的双阈值检测。低阈值用于确定弱边缘。

    • 75:高阈值(threshold2),用于Canny边缘检测中的双阈值检测。高阈值用于确定强边缘。

dilate和erode

膨胀和侵蚀

cpp 复制代码
// 扩大和侵蚀图像
// 创建一个核,增加Size(只能是奇数)会扩张/侵蚀更多
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
cv::dilate(imgCanny, imgDila, kernel);			// 扩张边缘,增加边缘厚度
cv::erode(imgDila, imgErode, kernel);			// 侵蚀边缘,减小边缘厚度
  • cv::getStructuringElement

    • cv::getStructuringElement是OpenCV中的一个函数,用于创建形态学操作的结构元素(也称为核或掩模)。
  • 参数解释

    • cv::MORPH_RECT:指定结构元素的形状为矩形。

    • cv::Size(3, 3):指定结构元素的大小为3×3。这意味着结构元素是一个3×3的矩形,中心像素为(1, 1)。

  • cv::dilate

    • cv::dilate是OpenCV中的一个函数,用于对图像进行膨胀操作。膨胀操作可以扩大图像中的白色区域,通常用于连接断开的部分或填补小孔。
  • 参数解释

    • imgCanny:输入图像,这是一个经过Canny边缘检测的二值图像。

    • imgDila:输出图像,经过膨胀操作后的图像。

    • kernel:结构元素,用于定义膨胀操作的邻域。

  • cv::erode

    • cv::erode是OpenCV中的一个函数,用于对图像进行腐蚀操作。腐蚀操作可以缩小图像中的白色区域,通常用于去除小的噪点或分离粘连的部分。
  • 参数解释

    • imgDila:输入图像,这是一个经过膨胀操作的图像。

    • imgErode:输出图像,经过腐蚀操作后的图像。

    • kernel:结构元素,用于定义腐蚀操作的邻域。

总体代码

cpp 复制代码
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

 basic functions ///
int main()
{
	std::string path = "Resources/test.png";		// 图片路径
	cv::Mat img = cv::imread(path);					// 读数据
	cv::Mat imgGray, imgBlur, imgCanny, imgDila, imgErode;

	// cvt是convert的缩写,将图像从一种颜色空间转换为另一种颜色空间
	// 把img转换成imgGray
	cv::cvtColor(img, imgGray, cv::COLOR_BGR2GRAY);

	// 使用高斯滤波器模糊图像。该函数将源图像与指定的高斯核进行卷积,Size(7,7)是核大小,数字越大越模糊
	// 把img模糊成imgBlur
	cv::GaussianBlur(img, imgBlur, cv::Size(7, 7), 5, 0);

	// 边缘检测,阈值1,2可调,目的:显示更多的边缘,使用模糊的图像
	cv::Canny(imgBlur, imgCanny, 25, 75);

	// 扩大和侵蚀图像
	// 创建一个核,增加Size(只能是奇数)会扩张/侵蚀更多
	cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
	cv::dilate(imgCanny, imgDila, kernel);			// 扩张边缘,增加边缘厚度
	cv::erode(imgDila, imgErode, kernel);			// 侵蚀边缘,减小边缘厚度


	cv::imshow("Image", img);						// 显示数据
	cv::imshow("Image Gray", imgGray);				// 显示灰色数据
	cv::imshow("Image Blur", imgBlur);				// 显示模糊数据
	cv::imshow("Image Canny", imgCanny);			// 显示边缘检测数据
	cv::imshow("Image imgDila", imgDila);			// 显示扩张边缘数据
	cv::imshow("Image imgErode", imgErode);			// 显示侵蚀检测数据


	cv::waitKey(0);									// 增加延时,0表示无穷
	return 0;
}

测试

3 resize and crop

调整图片和裁剪图片

cpp 复制代码
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

using namespace std;
using namespace cv;


 resize and crop ///

int main(int argc, char** argv)
{
	string path = "Resources/test.png";		// 图片路径
	cv::Mat img = cv::imread(path);			// 读图片
	cv::Mat imgResize, imgCrop;				// 调整图片和裁剪图片

	// [768 x 559]
	//std::cout << img.size() << std::endl;
	// 调整大小
	//cv::resize(img, imgResize, Size(), 0.5, 0.5);  // 长宽各自缩小0.5
	cv::resize(img, imgResize, Size(680, 400));		 // 缩小到680*400

	// 裁剪
	// 从200*100处开始裁剪,各自裁剪300
	cv::Rect rect(200, 100, 300, 300);
	imgCrop = img(rect);

	// 显示
	cv::imshow("Image", img);
	cv::imshow("Image Resize", imgResize);
	cv::imshow("Image Crop", imgCrop);

	cv::waitKey(0);									// 增加延时,0表示无穷
	return 0;
}

测试

学习:4h上手C++版Opencv_哔哩哔哩_bilibili

相关推荐
电子云与长程纠缠13 分钟前
在UE5中使用视差贴图
学习·缓存·ue5·编辑器·贴图
oioihoii31 分钟前
《C++11》nullptr介绍:从NULL说起
android·java·c++
柠石榴34 分钟前
【练习】力扣热题100 有效的括号
c++·算法·leetcode·职场和发展
0xCC说逆向38 分钟前
Windows图形界面(GUI)-QT-C/C++ - Qt图形绘制详解
c语言·开发语言·c++·windows·qt·mfc·win32
jf加菲猫41 分钟前
3 生成器(Builder)模式
c++·设计模式
wdfk_prog43 分钟前
rtthread学习笔记系列(2) -- 宏
笔记·学习
情深不寿3171 小时前
C++----STL(string)
开发语言·c++
boss-dog1 小时前
C++内存泄露排查
c++·内存泄露
旧物有情1 小时前
蓝桥杯历届真题 # 数字诗意(C++,Java)
java·c++·蓝桥杯
m0_743106461 小时前
【论文笔记】SmileSplat:稀疏视角+pose-free+泛化
论文阅读·深度学习·计算机视觉·3d·几何学