OpenCV学习笔记(完)
OPENCV学习笔记
- OPENCV学习笔记
- 图像、视频、摄像头读取
- 图片灰度转换
- 模糊处理
- 边缘检测
- 膨胀、腐蚀
- 膨胀
- 腐蚀
- 图片尺寸更改
- 查看图片像素点
- 等比例放大缩小图片
- 裁剪图片
- 图片创作
- 画圆
- 矩形
- 透视变换
- 颜色检测
OPENCV学习笔记
#include<opencv2/imgcodecs.hpp>
opencv2/imgcodecs.hpp 头文件,这是 OpenCV 库中用于图像编解码的头文件之一。通过包含这个头文件,在代码中使用 OpenCV 提供的图像读取、写入和编解码等功能。#include<opencv2/highgui.hpp>
opencv2/highgui.hpp 头文件,这是 OpenCV 库中用于图形用户界面(GUI)和交互式操作的头文件之一。通过包含这个头文件,在代码中使用
OpenCV提供的显示图像、创建窗口、处理鼠标事件等功能。
这个头文件通常用于图像显示、交互式图像处理和用户界面相关的操作。如果代码需要实现图像显示、交互或与用户进行交互的功能,包含这个头文件是非常有用的。#include<opencv2/imgproc.hpp>
opencv2/imgproc.hpp 头文件,这是 OpenCV 库中用于图像处理的头文件之一。通过包含这个头文件,在代码中使用 OpenCV 提供的各种图像处理函数和算法,如滤波、边缘检测、图像变换等。
imgproc 是 Image Processing(图像处理)的缩写,这个头文件包含了许多用于处理图像的函数和类。如果代码需要进行图像处理操作,比如平滑、边缘检测、形态学操作等,包含这个头文件是非常重要的。
图像、视频、摄像头读取
#include<opencv2/imgcodecs.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>using namespace std;
using namespace cv;image/// //打开图片
int main(int argc, char *argv[])
{string path = "/home/wlj/image/test.h";Mat img = imread(path);return 0;
}
1. int main(int argc, char *argv[]) : 这是程序的入口点, argc 表示命令行参数的数量, argv 是一个指向参数字符串数组的指针。
2. string path = "/home/wlj/image/test.h"; : 在这一行中,定义了一个字符串变量 path ,用于存储图像文件的路径 "/home/wlj/image/test.h" 。
3. Mat img = imread(path); : 这一行使用 OpenCV 的 imread() 函数从指定路径加载图像文件,并将其存储在 Mat 类型的对象 img 中。
4. return 0; : 最后一行表示程序正常结束并返回退出码 0。 video/// //打开视频
int main(int argc, char *argv[])
{string path = "/home/wlj/image/test2.mp4";VideoCapture cap(path);Mat img;while(true){cap.read(img);imshow("Image",img);waitKey(1);}return 0;
}
1. int main(int argc, char *argv[]) : 这是程序的入口点, argc 表示命令行参数的数量, argv 是一个指向参数字符串数组的指针。
2. string path = "/home/wlj/image/test2.mp4"; : 在这一行中,定义了一个字符串变量 path ,用于存储视频文件的路径 "/home/wlj/image/test2.mp4" 。
3. VideoCapture cap(path); : 这一行使用 OpenCV 的 VideoCapture 类从指定路径打开视频文件,创建了一个视频捕获对象 cap 。
4. Mat img; : 这一行定义了一个 Mat 类型的对象 img ,用于存储每一帧视频图像。
5. while(true) { ... } : 这是一个无限循环,用于不断读取视频的每一帧并显示。
6. cap.read(img); : 在循环中,使用 cap.read() 方法从视频文件中读取一帧图像,并将其存储在 img 中。
7. imshow("Image", img); : 使用 imshow() 函数显示读取到的图像,窗口标题为 "Image"。
8. waitKey(1); : waitKey() 函数等待指定的毫秒数(这里是1毫秒),并检测键盘输入。这样可以实现视频帧的连续显示。
9. return 0; : 最后一行表示程序正常结束并返回退出码 0。 Webcam/// //打开摄像头
int main(int argc, char *argv[])
{VideoCapture cap(0);Mat img;while(true){ cap.read(img);imshow("Image",img);waitKey(1);}return 0;
}
1. int main(int argc, char *argv[]) : 这是程序的入口点, argc 表示命令行参数的数量, argv 是一个指向参数字符串数组的指针。
2. VideoCapture cap(0); : 这一行创建了一个 VideoCapture 对象 cap ,并指定参数为 0,表示打开默认摄像头设备。如果您有多个摄像头,可以通过不同的参数值选择不同的摄像头。
3. Mat img; : 这一行定义了一个 Mat 类型的对象 img ,用于存储每一帧视频图像。
4. while(true) { ... } : 这是一个无限循环,用于不断从摄像头捕获视频帧并显示。
5. cap.read(img); : 在循环中,使用 cap.read() 方法从摄像头捕获一帧图像,并将其存储在 img 中。
6. imshow("Image", img); : 使用 imshow() 函数显示捕获到的图像,窗口标题为 "Image"。
7. waitKey(1); : waitKey() 函数等待指定的毫秒数(这里是1毫秒),并检测键盘输入。这样可以实现实时显示摄像头捕获的视频。
8. return 0; : 最后一行表示程序正常结束并返回退出码 0。
图片灰度转换
#include<opencv2/imgcodecs.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;//image///
#include<opencv2/imgcodecs.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>using namespace std;
using namespace cv;//image///
int main(int argc, char *argv[])
{string path = "/home/wlj/opencv_test/1.jpg"; //设置图片路径Mat img = imread(path); //读取图片路径Mat imgGray; //创建灰度图片对象 Mat imgGray_resized; //创建灰度图片改变图片大小后的对象 Size newsize(800,800); //定义要改变的图片尺寸cvtColor(img,imgGray,COLOR_BGR2GRAY); //灰度转换 resize(imgGray,imgGray_resized,newsize);//灰度图片尺寸变换 imshow("Image",img); //显示原图片imshow("Image_Gray",imgGray_resized); //显示转换为灰度且改变过尺寸的图片waitKey(0);
}1. Mat imgGray; : 这一行定义了一个 Mat 类型的对象 imgGray ,用于存储灰度图像。
2. Mat imgGray_resized; : 这一行定义了一个 Mat 类型的对象 imgGray_resized ,用于存储改变尺寸后的灰度图像。
3. Size newsize(800,800); : 这一行定义了一个 Size 类型的变量 newsize ,表示要改变的图像尺寸为 800x800 像素。
4. cvtColor(img, imgGray, COLOR_BGR2GRAY); : 这一行代码将彩色图像 img 转换为灰度图像,并将结果存储在 imgGray 中。 COLOR_BGR2GRAY 是一个 OpenCV 提供的颜色转换标志,用于将彩色图像转换为灰度图像。
5. resize(imgGray, imgGray_resized, newsize); : 这一行代码将灰度图像 imgGray 改变为指定尺寸 newsize 的图像,并将结果存储在 imgGray_resized 中。这里使用 resize() 函数进行图像尺寸的改变。
模糊处理
#include<opencv2/imgcodecs.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>using namespace std;
using namespace cv;//image///
int main(int argc, char *argv[])
{string path = "/home/wlj/opencv_test/2.jpg";Mat img = imread(path);Mat imgGray, imgBlur; //创建灰度对象,模糊对象Mat imgGray_resized;Size newsize(800,800);cvtColor(img,imgGray,COLOR_BGR2GRAY);resize(imgGray,imgGray_resized,newsize);GaussianBlur(img,imgBlur,Size(7,7),5,0); //高斯模糊函数imshow("Image",img);//imshow("Image_Gray",imgGray_resized);imshow("Image_Blur",imgBlur);waitKey(0);
}
GaussianBlur 是 OpenCV 中用于对图像进行高斯模糊处理的函数之一。高斯模糊是一种常用的图像处理操作,可以减少图像中的噪声,平滑图像并模糊细节。
void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT);
参数解释:
src
:输入图像(源图像)。dst
:输出图像(模糊后的图像)。ksize
:高斯核的大小。这个值必须是正奇数,如 Size(3,3)、Size(5,5) 或 Size(7,7) 等。sigmaX
:X方向上的高斯核函数标准差。sigmaY
:Y方向上的高斯核函数标准差。如果sigmaY设置为0,则它会等于sigmaX;如果两者都设置为0,则它们会根据ksize计算得出。borderType
:像素外推法选择,决定如何处理图像边界。默认是BORDER_DEFAULT
。
在你提供的例子中:
cpp复制代码
GaussianBlur(img, imgBlur, Size(7,7), 5, 0);
img
是源图像。imgBlur
是模糊处理后的图像。Size(7,7)
是高斯核的大小,这里选择了7x7的核。5
是X方向上的标准差。由于sigmaY
被设置为0,它会自动等于sigmaX
的值,即5。0
是sigmaY
的值,这里被省略了,所以它的值等于sigmaX
。
通过调整 ksize
和 sigmaX
/sigmaY
的值,你可以控制模糊的程度。核的大小和标准差越大,图像越模糊。在进行高斯模糊时,选择合适的参数对于保持图像细节和减少噪声之间的平衡至关重要。
边缘检测
#include<opencv2/imgcodecs.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>using namespace std;
using namespace cv;//image///
int main(int argc, char *argv[])
{string path = "/home/wlj/opencv_test/2.jpg";Mat img = imread(path);Mat imgGray, imgBlur;Mat imgGray_resized,img_resized,imgBlur_resized,imgcanny;//改变图片大小Size newsize(800,800);resize(img,img_resized,newsize);////cvtColor(img_resized,imgGray,COLOR_BGR2GRAY); //灰度转换//resize(imgGray,imgGray_resized,newsize);//GaussianBlur(img_resized,imgBlur_resized,Size(7,7),5,0);//resize(imgBlur,imgBlur_resized,newsize);Canny(img_resized,imgcanny,50,150);imshow("Image",img_resized);//imshow("Image_Gray",imgGray_resized);//imshow("Image_Gray",imgGray);imshow("Image_canny",imgcanny);waitKey(0);
}
在边缘检测中,Canny边缘检测是一种常用的方法,它基于多阶段算法来检测图像中的边缘。在OpenCV库中,Canny()
函数是用来实现Canny边缘检测的。
函数原型通常是这样的:
cpp复制代码
void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false);
参数解释:
image
:输入图像,通常是灰度图像。edges
:输出边缘图像,与输入图像有相同的尺寸和类型。threshold1
:较小的阈值,用于滞后阈值处理。threshold2
:较大的阈值,用于滞后阈值处理。apertureSize
:Sobel核的大小,默认为3。L2gradient
:一个布尔值,指定在计算图像梯度幅度时是否使用L2范数。
代码 Canny(img_resized, imgcanny, 50, 150);
中,50
和 150
分别是 threshold1
和 threshold2
的值。这两个阈值在Canny算法中起到了非常重要的作用。
threshold1
(较小的阈值):只有那些梯度强度大于这个阈值的边缘才会被保留。threshold2
(较大的阈值):任何梯度强度小于这个阈值的边缘都会被丢弃。- 在
threshold1
和threshold2
之间的边缘,如果它们与高于threshold2
的边缘相连,则会被保留;否则,它们会被丢弃。
通过调整这两个阈值,你可以控制边缘检测结果的敏感度。较小的 threshold1
和较大的 threshold2
之间的差值越大,边缘检测结果中包含的细节就越多,但同时也可能引入更多的噪声。相反,减小这个差值会减少检测到的边缘数量,但结果会更加稳定。
膨胀、腐蚀
膨胀
#include<opencv2/imgcodecs.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>using namespace std;
using namespace cv;//image///
int main(int argc, char *argv[])
{string path = "/home/wlj/opencv_test/2.jpg";Mat img = imread(path);Mat imgGray, imgBlur;Mat imgGray_resized,img_resized,imgBlur_resized,imgcanny;Mat imgDia,imgErode;//改变图片大小Size newsize(800,800);resize(img,img_resized,newsize);////cvtColor(img_resized,imgGray,COLOR_BGR2GRAY); //灰度转换//resize(imgGray,imgGray_resized,newsize);GaussianBlur(img_resized,imgBlur_resized,Size(7,7),5,0);//resize(imgBlur,imgBlur_resized,newsize);Canny(imgBlur_resized,imgcanny,50,150);Mat knerel = getStructuringElement(MORPH_RECT,Size(5,5));dilate(imgcanny,imgDia,knerel);imshow("Image",img_resized);//imshow("Image_Blur",imgBlur_resized);//imshow("Image_Gray",imgGray_resized);//imshow("Image_Gray",imgGray);//imshow("Image_canny",imgcanny);imshow("Image_Dia",imgDia);waitKey(0);
}
Mat knernel = getStructuringElement(MORPH_RECT, Size(5, 5));
这行代码使用getStructuringElement
函数创建了一个用于膨胀操作的结构元素(通常称为核或模板)。结构元素决定了膨胀操作的局部邻域的形状和大小。
MORPH_RECT
:表示使用矩形形状的结构元素。OpenCV还提供了其他形状,如椭圆形(MORPH_ELLIPSE
)和十字形(MORPH_CROSS
)。Size(5, 5)
:定义了结构元素的大小,这里是5x5像素。
getStructuringElement
函数返回一个Mat
对象,它包含了定义好的结构元素,这个对象在这里被命名为knerel
(注意这里可能是一个拼写错误,通常应该是kernel
)。
dilate(imgcanny, imgDia, knernel);
这行代码使用dilate
函数对图像imgcanny
执行膨胀操作,并将结果存储在imgDia
中。
imgcanny
:输入图像,通常是边缘检测后的二值图像。imgDia
:输出图像,即膨胀后的图像。knerel
:在上一行代码中定义的结构元素,用于控制膨胀操作。
膨胀操作将imgcanny
图像中的白色区域(通常是边缘)进行扩展,使得原本断裂的边缘能够连接起来,或者小的黑色区域(孔洞)被填充。这有助于强化边缘信息,特别是在后续处理中可能需要连续边缘的情况。
腐蚀
#include<opencv2/imgcodecs.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>using namespace std;
using namespace cv;//image///
int main(int argc, char *argv[])
{string path = "/home/wlj/opencv_test/2.jpg";Mat img = imread(path);Mat imgGray, imgBlur;Mat imgGray_resized,img_resized,imgBlur_resized,imgcanny;Mat imgDia,imgErode;//改变图片大小Size newsize(800,800);resize(img,img_resized,newsize);////cvtColor(img_resized,imgGray,COLOR_BGR2GRAY); //灰度转换//resize(imgGray,imgGray_resized,newsize);GaussianBlur(img_resized,imgBlur_resized,Size(7,7),5,0);//resize(imgBlur,imgBlur_resized,newsize);Canny(imgBlur_resized,imgcanny,50,150);Mat knerel = getStructuringElement(MORPH_RECT,Size(5,5));dilate(imgcanny,imgDia,knerel);erode(imgDia,imgErode,knerel);imshow("Image",img_resized);//imshow("Image_Blur",imgBlur_resized);//imshow("Image_Gray",imgGray_resized);//imshow("Image_Gray",imgGray);//imshow("Image_canny",imgcanny);imshow("Image_Dia",imgDia);imshow("Image_ Erode",imgErode);waitKey(0);
}
erode() 是 OpenCV 中用于腐蚀(Erosion)操作的函数之一。腐蚀是图像处理中的一种形态学操作,用于缩小图像中的白色区域(前景对象),同时扩大黑色区域(背景)。
函数原型如下:
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 : 腐蚀操作的结构元素,定义了腐蚀操作的形状和大小。
- anchor : 结构元素的锚点,默认为 (-1, -1),表示结构元素的中心点。
- iterations : 腐蚀操作的迭代次数,默认为 1。
- borderType : 边界填充类型,默认为 BORDER_CONSTANT 。
图片尺寸更改
查看图片像素点
cout<<img.size()<<endl;
这行代码 cout << img.size() << endl; 用于输出图像 img 的尺寸信息。在 OpenCV 中, size() 函数用于获取图像的尺寸,返回一个 Size 类型的对象,包含图像的宽度和高度信息。
当使用 cout 输出 img.size() 时,将会打印出图像的尺寸信息,通常格式为 (width, height) 。这样可以方便了解图像的大小,进行后续的图像处理和分析。
等比例放大缩小图片
#include<opencv2/imgcodecs.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>using namespace std;
using namespace cv;//image///
int main(int argc, char *argv[])
{string path = "/home/wlj/opencv_test/2.jpg";Mat img = imread(path);Mat img_resized;resize(img,img_resized,Size(),0.5,0.5);imshow("Image",img);imshow("Image_resized",img_resized);waitKey(0);
}
裁剪图片
#include<opencv2/imgcodecs.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>using namespace std;
using namespace cv;//image///
int main(int argc, char *argv[])
{string path = "/home/wlj/opencv_test/2.jpg";Mat img = imread(path);Mat img_resized,img_Crop;resize(img,img_resized,Size(),0.5,0.5);Rect roi(100,200,250,300);img_Crop = img(roi);imshow("Image",img);imshow("Image_resized",img_resized);imshow("Image_Crop",img_Crop);waitKey(0);
}
Rect roi(100,200,250,300);
img_Crop = img(roi);
roi的含义为从横向第100个像素点出发,一直到地250个像素点结束,纵向从第200个像素点出发,到第300个像素点结束裁剪图片
图片创作
#include<opencv2/imgcodecs.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{Mat img(512,512,CV_8UC3,Scalar(255,255,255));imshow("image",img); waitKey(0);
}
Mat img(512, 512, CV_8UC3, Scalar(255, 255, 255));
Mat img
:声明一个名为img
的Mat
对象。Mat
是OpenCV中用于存储图像数据的类。512, 512
:这两个参数分别指定了图像的行数和列数,即图像的高度和宽度。这里创建的是一个512x512像素的图像。CV_8UC3
:这是一个数据类型标识符,用于指定图像矩阵中元素的类型和通道数。CV_8U
:表示每个元素是一个8位无符号整数(即每个像素值的范围是0到255)。C3
:表示图像有三个通道,通常是彩色图像的红色、绿色和蓝色通道(RGB)。
Scalar(255, 255, 255)
:这是一个Scalar
对象,用于初始化图像矩阵中的每个像素值。在这里,它被用来将图像的所有像素初始化为白色(RGB值为(255, 255, 255))。对于彩色图像,Scalar
对象中的每个值分别对应一个通道,即红色、绿色和蓝色。
画圆
#include<opencv2/imgcodecs.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{Mat img(512,512,CV_8UC3,Scalar(255,255,255));circle(img,Point(256,256),200,Scalar(0,100,80));imshow("image",img); waitKey(0);
}
Mat img(512,512,CV_8UC3,Scalar(255,255,255));
circle(img,Point(256,256),200,Scalar(0,100,80));
-
Mat img(512, 512, CV_8UC3, Scalar(255, 255, 255)); :这行代码定义并初始化了一个 Mat 对象 img 。
-
512, 512:指定了图像的宽度和高度,即图像的尺寸为 512x512 像素。
-
CV_8UC3 :指定了图像的数据类型和通道数。 CV_8UC3 表示每个像素由 3 个无符号 8 位整数组成,即每个像素有 3 个通道(RGB)。
-
Scalar(255, 255, 255) :指定了初始化像素的颜色。在这里, Scalar(255, 255, 255) 表示白色,即 R、G、B 通道的值均为 255,代表白色。
-
circle
:这是OpenCV中用于绘制圆的函数。 -
img
:这是你要在其上绘制圆的图像对象(Mat
对象)。 -
Point(256, 256)
:这是圆的中心点的坐标。在这里,圆的中心被设置为(256, 256)
,即图像的正中心(假设图像是512x512像素,如你在之前的代码段中创建的)。 -
200
:这是圆的半径,单位是像素。这里圆的半径被设置为200像素。 -
Scalar(0, 100, 80)
:这是用于绘制圆的颜色的BGR值。Scalar
对象在这里定义了圆的颜色,其中蓝色通道值为0,绿色通道值为100,红色通道值为80。这个颜色将是一个偏绿色的颜色。 -
10
:这是圆的线宽。线宽设置为10意味着圆的边缘将是一个相对较粗的线条。如果设置为-1,则圆将被绘制为填充圆。
综合起来,这行代码将在img
图像的正中心(256, 256)绘制一个半径为200像素的圆,该圆的颜色偏绿,边缘线宽为10像素。如果你想要一个填充的圆,可以将最后一个参数设置为-1。
矩形
#include<opencv2/imgcodecs.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{Mat img(512,512,CV_8UC3,Scalar(255,255,255));circle(img,Point(256,256),200,Scalar(0,100,80));rectangle(img,Point(150,150),Point(300,300),Scalar(255,255,0),3);imshow("image",img); waitKey(0);
}
rectangle(img,Point(150,150),Point(300,300),Scalar(255,255,0),3);
从左上角第一点到右下角最后一个点确定矩形的位置
透视变换
使用画图工具确定像素大小
#include<opencv2/imgcodecs.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>using namespace std;
using namespace cv;
float w = 800;
float h = 880;
Mat matrix,imgWarp;
int main(int argc, char *argv[])
{string path = "/home/wlj/opencv_test/2.jpg";Mat img = imread(path);Mat img_resized,imgWarp_resized;Point2f src[4] = {{250,200},{550,200},{250,688},{550,688}};Point2f dis[4] = {{0.0f,0.0f},{w,0.0f},{0.0f,h},{w,h}};matrix = getPerspectiveTransform(src,dis);resize(img,img_resized,Size(),0.5,0.5);warpPerspective(img,imgWarp,matrix,Point(w,h));resize(imgWarp,imgWarp_resized,Size(),0.5,0.5);imshow("image",img_resized);imshow("image warp",imgWarp_resized);waitKey(0);
}
这段代码实现了图像的透视变换(Perspective Transformation),即将原始图像中的一个四边形区域映射到目标图像中的另一个四边形区域,从而实现图像的透视效果。让我逐行解释一下这段代码: 1. #include<opencv2/imgcodecs.hpp> , #include<opencv2/highgui.hpp> , #include<opencv2/imgproc.hpp> , #include<iostream> : 这些是 OpenCV 库中的头文件,提供了图像编解码、图形用户界面、图像处理和标准输入输出的功能。
2. using namespace std; , using namespace cv; : 使用了命名空间 std 和 cv ,避免在代码中频繁使用 std:: 和 cv:: 。
3. float w = 800; , float h = 800; : 定义了目标图像的宽度和高度。
4. Mat matrix, imgWarp; : 定义了透视变换矩阵和透视变换后的图像。
5. string path = "/home/wlj/opencv_test/2.jpg"; , Mat img = imread(path); : 加载指定路径的图像文件并将其存储在 Mat 对象 img 中。
6. Mat img_resized, imgWarp_resized; : 定义了两个用于存储缩放后图像的 Mat 对象。
7. Point2f src[4] = {{1447,1203},{2683,1179},{1358,1803},{2883,1777}}; , Point2f dis[4] = {{0.0f,0.0f},{w,0.0f},{0.0f,h},{w,h}}; : 定义了原始图像中的四个顶点和目标图像中对应的四个顶点。
8. matrix = getPerspectiveTransform(src, dis); : 根据原始图像和目标图像的四个顶点,计算透视变换矩阵。
9. resize(img, img_resized, Size(), 0.2, 0.2); : 缩放原始图像,将其大小调整为原来的 20%。
10. warpPerspective(img, imgWarp, matrix, Point(w, h)); : 对原始图像进行透视变换,将其映射到目标图像中。
11. resize(imgWarp, imgWarp_resized, Size(), 0.2, 0.2); : 缩放透视变换后的图像,将其大小调整为原来的 20%。
12. imshow("image", img_resized); , imshow("image warp", imgWarp_resized); : 显示原始图像和透视变换后的图像。
13. waitKey(0); : 等待用户按下任意键后关闭窗口。
颜色检测
#include<opencv2/imgcodecs.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>
#include<iostream>using namespace std;
using namespace cv;
Mat imgHSV,mask;
int hmin = 0,smin = 0,vmin= 0;
int hmax = 179, smax = 255,vmax = 255;
int main(int argc, char *argv[])
{string path = "/home/wlj/opencv_test/2.jpg";Mat img = imread(path);Mat img_resized;if(img.empty()){cout<<"图片未成功加载!!!"<<endl;}else{cvtColor(img,imgHSV,COLOR_BGR2HSV);}namedWindow("Trackbars",(200,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);//resize(img,img_resized,Size(),0.5,0.5);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); }}
以检测绿色为例,首先设置默认值,hmax=179,smax=255,vmax’=255,分别按次序调整hmin,smin,vmin的值,每当绿色方块对应的白色区域即将消失时,立即调整下一个min值,直至剩下绿色方块对应的白色区域,即为检测到的绿色区域。