4h上手C++版Opencv-Jojo

 内容为 'Jojo'编写,日常学习总结,内容如有不足、不妥之处请私信告知,谢谢!

opencv4.5.0的下载与环境配置

Releases - OpenCV

vs环境配置

项目属性页

 

验证是否配置成功

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;


/  Images  //

void main() {

    string path = "Resources/test.png";
    Mat img = imread(path);
    imshow("Image", img);
    waitKey(0);
}

第一章

图片展示

/   Images   ///
void main()
{
	string path = "Resources/test.png";   //图片路径
	Mat img = imread(path);               //图片读取
	imshow("Image", img);                 //创建一个串口,图片展示
	waitKey(0);                           //等待图片刷新   0-无穷大
}

【OpenCV】imshow()和namedWindow()之间的关系,解决两个窗口问题

waitkey:函数告诉系统暂停并且等待键盘事件(0或负数,等待到有键被按下)。如果其传入了一个大于0的参数,它将会等待等同于该参数的毫秒事件。 

视频展示

///   Video   ///
void main()
{
	string path = "Resources/test_video.mp4";
	VideoCapture cap(path);    
	Mat img;
	while (true)            //需要循环读出每一帧
	{  
		cap.read(img);
		imshow("Image", img);
		waitKey(1);
	}
}

网络摄像头

///   Webcam   ///
void main()
{
	VideoCapture cap(0);        //选择的ID号   -1-.随机选择一个
	Mat img;
	while (true)
	{
		cap.read(img);
		imshow("Image", img);
		waitKey(1);
	}
}

第二章

cvtcolor()

一个颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间转换。也可以转换为灰度图。”

 函数原型:

CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );

src:平面图像源文件

dst:输出图形

code:指定转换类型

cvtColor(img, imgGray, COLOR_BGR2GRAY);

GaussianBlur()

高斯滤波器,对图像进行高斯滤波,去除噪声,图像预处理一般都用

 函数原型:

CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                                double sigmaX, double sigmaY = 0,
                                int borderType = BORDER_DEFAULT );

src:输入的图像

dst:输出图像

ksize:高斯卷积核的大小,是奇数

sigmaX, sigmaY=0, :表示高斯核x和y方向的方差,如果只给了x,同时y=0(默认)则y方向的方差与x相等

borderType=BORDER_DEFAULT :边界的处理方式,一般默认

GaussianBlur(img, imgBlur, Size(3, 3), 3, 0);

 Canny()

边缘检测算法

CV_EXPORTS_W void Canny( InputArray image, OutputArray edges,
                         double threshold1, double threshold2,
                         int apertureSize = 3, bool L2gradient = false );

image:输入源图像

edges:输出的图形

threshold1:第一个滞后性阈值【低阈值】。值越大,找到的边缘越少

threshold2:第二个滞后性阈值【高阈值】。

apertureSize:表示应用Sobel算子的孔径大小,其有默认值3。

L2gradient:一个计算图像梯度幅值的标识,有默认值false。

低于阈值1的像素点会被认为不是边缘;

高于阈值2的像素点会被认为是边缘;

在阈值1和阈值2之间的像素点,若与第2步得到的边缘像素点相邻,则被认为是边缘,否则被认为不是边缘

Canny(imgBlur, imgCanny, 25, 75);

 getStructuringElement()

获取结构化元素,会返回指定形状和尺寸的结构元素

 函数原型:

CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

shape:表示内核的形状,有三种:

  • 矩形:MORPH_RECT
  • 交叉形:MORPH_CROSS
  • 椭圆形:MORPH_ELLIPSE

ksize:表示内核的尺寸

anchor:表示锚点的位置。
对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心点。element形状唯一依赖锚点位置,其他情况下,锚点只是影响了形态学运算结果的偏移。

Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));

dilate()

函数原型:

CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,
                          Point anchor = Point(-1,-1), int iterations = 1,
                          int borderType = BORDER_CONSTANT,
                          const Scalar& borderValue = morphologyDefaultBorderValue() );

使用像素邻域内的局部极大运算符来膨胀图像

scr:输入的图形

dst:输出的图形

kernel:膨胀操作的核。当为NULL时,表示的是使用的是参考点位于中心3*3的核。配合getStructuringElement()使用

anchor:Point类型的anchor,锚点的位置,默认值是 (-1, -1),表示位于中心。

iterations:int类型的iterations,迭代的次数,默认值是1。

borderType:边界类型,用于推断图像外部像素的某种边界模式,默认值是BORDER_DEFAULT。

borderValue:边界值

Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
dilate(imgCanny, imgDil, kernel);

 erode()

腐蚀运算

 函数原型:

CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,
                         Point anchor = Point(-1,-1), int iterations = 1,
                         int borderType = BORDER_CONSTANT,
                         const Scalar& borderValue = morphologyDefaultBorderValue() );

src:输入源图像

dst:输出图形

kernel:腐蚀操作的内核,若为 NULL 时,表示的是使用参考点位于中心 3x3 的核。我们一般使用函数 getStructuringElement 配合这个参数的使用。

anchor:锚的位置,其有默认值(-1,-1),表示锚位于单位(element)的中心,我们一般不用管

iterations:迭代使用 erode()函数的次数,默认值为 1。

borderType:用于推断图像外部像素的某种边界模式。注意它有默认值 BORDER_DEFAULT。

borderValue:当边界为常数时的边界值,有默值 morphologyDefaultBorderValue() 

Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
erode(imgDil, imgErode, kernel);

 

 第三章

resize()

分配容器的内存大小,对图片进行缩放

void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR)

src - 原图
dst - 目标图像。当参数dsize不为0时,dst的大小为size;否则,它的大小需要根据src的大小,参数fx和fy决定。dst的类型(type)和src图像相同
dsize - 目标图像大小,所以,参数dsize和参数(fx, fy)不能够同时为0
fx - 水平轴上的比例因子。
fy - 垂直轴上的比例因子。
最后一个参数插值方法,是默认值,放大时最好选 INTER_LINEAR ,缩小时最好选 INTER_AREA。

resize(img, imgResize, Size(), 0.5, 0.5);

resize(img, imgResize, Size(600,600));

 Rect类

Rect(int x, int y, int width, int height);

进行图片的裁剪 

Rect(左上角 x 坐标  ,  左上角 y 坐标,矩形的宽,矩形的高)

Rect roi(100, 100, 300, 250);
imgCrop = img(roi);

第四章

void main()
{
	Mat img(512, 512, CV_8UC3, Scalar(255, 255, 255));
    //画圆
	circle(img, Point(256, 256), 155, Scalar(0, 69, 255),FILLED);
    //矩形
	rectangle(img, Point(130, 226), Point(382, 286), Scalar(255,255,255), FILLED);
    //画线
	line(img, Point(130, 296), Point(382, 296), Scalar(255, 255, 255), 2);
    //输出字体
	putText(img, "Murtaza's Workshop", Point(137, 262), FONT_HERSHEY_DUPLEX, 0.75, Scalar(0, 69, 255), 2);


	imshow("Image", img);

	waitKey(0);
}

circle函数    画圆

rectangle     矩形

line              画线

putText        输出字体

第五章

/   Warp Images   ///
float w = 250, h = 350;
Mat matrix, imgWarp;

void main()
{
	string path = "Resources/cards.jpg";
	Mat img = imread(path);

	Point2f src[4] = { {529,142},{771,190},{405,395},{674,457} };
	Point2f dst[4] = { {0.0f,0.0f},{w,0.0f},{0.0f,h},{w,h} };

	matrix = getPerspectiveTransform(src, dst);
	warpPerspective(img, imgWarp, matrix, Point(w, h));

	for (int i = 0; i < 4; i++)
	{
		circle(img, src[i], 10, Scalar(0, 0, 255), FILLED);
	}


	imshow("Image", img);
	imshow("Image Warp", imgWarp);
	waitKey(0);
}

getPerspectiveTransform warpPerspective

 第6章

Mat imgHSV, mask;
int hmin = 0, smin = 0, vmin = 0;
int hmax = 255, smax = 255, vmax = 255;

void main()
{
	string path = "Resources/shapes.png";
	Mat img = imread(path);
	cvtColor(img, imgHSV, COLOR_BGR2HSV);
    
    //创建滑块蓝
	namedWindow("Trackbars", (640, 200));
	createTrackbar("Hue Min", "Trackbars", &hmin, 179);
	createTrackbar("Hue Max", "Trackbars", &hmax, 179);
	createTrackbar("Sat Min", "Trackbars", &smin, 255);
	createTrackbar("Sat Max", "Trackbars", &smax, 255);
	createTrackbar("Val Min", "Trackbars", &vmin, 255);
	createTrackbar("Val Max", "Trackbars", &vmax, 255);

	while (true)
	{
		Scalar lower(hmin, smin, vmin);
		Scalar upper(hmax, smax, vmax);
		inRange(imgHSV, lower, upper, mask);

		imshow("Image", img);
		imshow("Image HSV", imgHSV);
		imshow("Image Mask", mask);
		waitKey(1);
	}
}

HSV颜色空间超极详解&inRange函数用法及实战

inRange()函数、cvtColor()函数、createTrackbar()函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值