内容为 'Jojo'编写,日常学习总结,内容如有不足、不妥之处请私信告知,谢谢!
opencv4.5.0的下载与环境配置
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);
}
}