OpenCV学习笔记(完)

【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV 邂逅OpenCV 文章目录邂逅OpenCV前言1.1 OpenCV周边概念认知1.1.1 图像处理、计算机视觉与OpenCV1.1.2 OpenCV概述1.1.3 起源及发展1.1.4 应用概述1.2 OpenCV基本架构分析1.3 OpenCV3带来了什么1.4 OpenCV的下载、安装与配置1.5 快速上手OpenCV图像处理前期准备1.5.1 程序一 图像显示1.5.2 程序二 图像腐蚀1.5.3 程序三 图像模糊1.5.4 程序四 canny边缘检测1.6 OpenCV视频操作基础1.6.1 读取并 阅读详情

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));
  1. Mat img:声明一个名为img的Mat对象。Mat是OpenCV中用于存储图像数据的类。
  2. 512, 512:这两个参数分别指定了图像的行数和列数,即图像的高度和宽度。这里创建的是一个512x512像素的图像。
  3. CV_8UC3:这是一个数据类型标识符,用于指定图像矩阵中元素的类型和通道数。
    • CV_8U:表示每个元素是一个8位无符号整数(即每个像素值的范围是0到255)。
    • C3:表示图像有三个通道,通常是彩色图像的红色、绿色和蓝色通道(RGB)。
  4. 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));
  1. Mat img(512, 512, CV_8UC3, Scalar(255, 255, 255)); :这行代码定义并初始化了一个 Mat 对象 img 。

  2. 512, 512:指定了图像的宽度和高度,即图像的尺寸为 512x512 像素。

  3. CV_8UC3 :指定了图像的数据类型和通道数。 CV_8UC3 表示每个像素由 3 个无符号 8 位整数组成,即每个像素有 3 个通道(RGB)。

  4. Scalar(255, 255, 255) :指定了初始化像素的颜色。在这里, Scalar(255, 255, 255) 表示白色,即 R、G、B 通道的值均为 255,代表白色。

  5. circle:这是OpenCV中用于绘制圆的函数。

  6. img:这是你要在其上绘制圆的图像对象(Mat对象)。

  7. Point(256, 256):这是圆的中心点的坐标。在这里,圆的中心被设置为(256, 256),即图像的正中心(假设图像是512x512像素,如你在之前的代码段中创建的)。

  8. 200:这是圆的半径,单位是像素。这里圆的半径被设置为200像素。

  9. Scalar(0, 100, 80):这是用于绘制圆的颜色的BGR值。Scalar对象在这里定义了圆的颜色,其中蓝色通道值为0,绿色通道值为100,红色通道值为80。这个颜色将是一个偏绿色的颜色。

  10. 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值,直至剩下绿色方块对应的白色区域,即为检测到的绿色区域。

请添加图片描述

opencv学习笔记 对于原图像中的每个像素点 (x, y),通过某种变换函数找到它在目标图像中对应的新位置 (x’, y’)。滤波的本质:通过一个小的滤波器(或称为核、模板)在图像上滑动,对每个像素邻域进行数学运算,得到新的像素值。基本原理:Laplacian是二阶微分算子,直接计算图像的拉普拉斯变换,对噪声更敏感但能检测更细的边缘。基本原理:Scharr算子是Sobel算子的改进版本,具有更高的旋转对称性和更好的边缘检测精度。原理:检查每个像素点,如果它在梯度方向上的幅值不是局部最大值,则将其抑制(设为0)。 阅读详情

相关推荐

机器视觉学习笔记(1)——OpenCV配置

机器视觉学习笔记(1)——OpenCV配置标签: 机器视觉1.什么是OpenCV OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。 简单地说,OpenCV就是一个第三方关于视觉处理的开源库,使用该库可以采集摄像头拍摄的视频,可以处理图

moverzp的博客 3711

#include "opencv2/imgcodecs.hpp"

没想到我安装的opencv2.4.9中竟然没有这个头文件,无奈只能上网查资料,终于在Github上找到了这个文件,这是Github上的链接: imgcodecs.hpp下载下来之后,直接放到了路径里:F:\opencv\build\include\opencv2\但是这个头文件里面还包含了另一个头文件: 运行的时候,又显示找不到这个头文件,这是因为在我的电脑中,core.hpp的路径是: 所以

Zender 8894

OpenCV学习笔记

使用C++和opencv进行图像处理

云龙的博客 5554

opencv基础功能实现

文章目录chapter1 Read Images Videos and Webcamschapter2 Basic Functionschapter3 Resize and Cropchapter4 Draw Shapes and Textchapter5 Warp Imageschapter6 Color Detectionchapter7 Shapes/Contour Detectionchapter8 Face Detectionproject1 Virtual Painterproject2 Doc

Mufafafa的博客 3528

Power BI----各类切片器的使用

首先介绍切片器的最基础的创建和效果演示,紧跟着介绍切片器在多页中的同步和本身与报表的联动,再然后介绍关于切片器属性的设置,使得交互更加美观,最后介绍几种很好看的第三方的切片器样式和自己构建的可折叠的切片器.........

Itsme_MrJJ的博客 2万+

手把手教你用HiNet实现图像隐藏:可逆神经网络实战指南(附代码)

本文提供了一份基于HiNet框架实现图像隐藏的实战指南。通过详细解析可逆神经网络原理,手把手指导环境搭建、模型构建、损失函数设计及训练流程,并附有完整代码。该方法利用单个可逆网络统一隐藏与恢复过程,结合小波变换提升隐蔽性,为信息隐藏应用提供了高效解决方案。

rgv234567的博客 433

imgcodecs.hpp源码

/*M/////////////////////////////////////////////////////////////////////////////////////// // //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. // //  By downloading, copying,

zz12306zz的博客 1809

三维重建笔记_光束平差法(Bundle Adjustment, BA)

目录 1 光束平差法(Bundle Adjustment, BA) 1.1 SFM (Structure‐from‐Motion) 定义 问题描述 1.2 重投影误差 (Reprojection Error) 目标函数 1.3 使用 Levenberg‐Marquardt Algorithm 进行优化 问题描述 简化目标函数 参考 Gauss‐Newton Method ...

惊鸿一博 2万+

Opencv c++(图像处理)

目录 一、图像读取与显示 二、图像预处理 高斯模糊的原理与算法 Canny边缘检测 三、图像裁剪 四、绘制形状和添加文本 五、透视变换 六、颜色检测 七、形状检测和轮廓检测 八、人脸识别 一、图像读取与显示 #include<opencv2/imgcodecs.hpp> #include<opencv2/highgui.hpp> #include<opencv2/imgproc.hpp> #include<iostream&g...

qq_62330330的博客 1万+

二、声明式 Pipeline 语法

选择型参数,一般用于给定几个可选的值,然后选择其中一个进行赋值,例如:parameters { choice(name: ‘CHOICES’, choices: [‘one’, ‘two’, ‘three’], description: ‘’) },表示定义一个名为 CHOICES 的变量,可选的值为 one、two、three;默认情况下,如果定义了某个 stage 的 agent,在进入该 stage 的 agent 后,该 stage 的 when条件才会被评估,但是可以通过一些选项更改此选项。

Cyan_Jiang的博客 1220

Flutter框架GetX从入门到精通第二篇:路由管理-告别繁琐的Navigator

Flutter框架GetX从入门到精通第二篇:告别繁琐的Navigator。本系列将带你从零开始,一步步掌握 GetX 框架的核心功能与实战技巧。

鹏多多的博客 170

opencv常用图像处理函数详解(一)

opencv 常用图像处理函数详解(一),利用opencv读取图像,保存图像,获取Mat中指定位置像素的值,转换图像的色彩,叠加两张图像,对图像进行二值化处理

qq_30150579的博客 1311

【Claude】API Error 通用错误:错误码含义与标准排查流程 bug报错已解决

Claude API 各类错误码速查与标准排查流程。

博客 8245

36篇博文带你学完opencv :python+opencv进阶版学习笔记目录

基础版学习笔记传送门 python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记 项目 opencv进阶学习笔记1: 调用摄像头用法大全(打开摄像头,打开摄像头并实时不断截屏,读取视频并截图) opencv进阶学习笔记2:numpy操作图像,色彩空间,查找指定颜色范围,通道分离与合并 opencv进阶学习笔记3:像素运算和图像亮度对比度调节 opencv进阶学习笔记4:ROI和泛洪扩充 opencv进阶学习笔记5:图像模糊操作,图像锐化,边缘保留滤波EPF(

总裁余(余登武)博客 6832

[QMT量化交易小白入门]-二、如何用miniQMT获取沪深A股的板块列表、历史行情数据和实时行情数据

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步,自己淋过雨了,希望大家都有一把伞。

木头大左的博客 5656

YOLOv11改进 | 特殊场景检测篇 | 低照度图像增强网络SCINet改进黑暗目标检测(全网独家首发)

本文给大家带来的改进机制是低照度图像增强网络SCINet,SCINet(自校正照明网络)是一种专为低光照图像增强设计的框架。它通过级联照明学习过程和权重共享机制来处理图像,优化了照明部分以提升图像质量。我将该网络集成在YOLOv11的主干上针对于图像的输入进行增强,同时该网络的并不会增加参数和计算量,基本和普通的网络结构保持一致,同时该结构支持自定义调节层数,来控制图像增强的效果 ,非常适合想要在黑夜目标检测领域发表文章的读者,该基本网络不会影响模型的速度。欢迎大家订阅我的专栏一起学习YOLO!

Snu77的博客 2207

36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版)

经过几天的学习,opencv基础部分学习完啦。整理出来。 OpenCV opencv学习笔记1:图片读入,显示与保存(有代码) opencv学习笔记2:图像处理基础 opencv学习笔记3:像素处理 opencv学习笔记4:获取图像属性 opencv学习笔记5:感兴趣区域ROI opencv 学习笔记6:通道的拆分与合并 opencv学习笔记7:图像加法与图像融合 opencv学习笔记8:类型转换 opencv 学习笔记9:图像缩放与图像翻转 opencv

总裁余(余登武)博客 7270

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

OpenCV学习笔记大集锦

转载自: OpenCV学习笔记大集锦 – 视觉机器人 http://www.cvrobot.net/collect-opencv-resource-learn-study-note-chinese/ 整理了我所了解的有关OpenCV的学习笔记、原理分析、使用例程等相关的博文。排序不分先后,随机整理的。如果有好的资源,也欢迎介绍和分享。 1:OpenCV学习笔记

Leo的博客 6662

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【OpenCV学习笔记】- 学习笔记目录

OpenCV - 学习笔记系列博文

移动的130 1474

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

OpenCv小白学习笔记(1)

OpenCv小白学习笔记(1)1 准备工作1.1 前言参考书籍1.2 安装OpenCv库1.2.1 环境及版本1.2.2 安装步骤 1 准备工作 1.1 前言 大家好,这里是一名计算机大三在读学生,正在零基础学习OpenCv,接下来将在我的博客持续记录我的学习笔记。不足之处烦请大神指正,也欢迎一起学习的小伙伴交流讨论~ 参考书籍 OpenCv计算机视觉编程攻略(第3版)Robert Laganie...

lihua_2333的博客 404

【OpenCV学习笔记23】- OpenCV中的轮廓 - 轮廓特征

简单实用OpenCV入门 - OpenCV中的轮廓 - 轮廓特征

移动的130 1283

OpenCV学习笔记 笔记汇总

OpenCV学习笔记 笔记汇总 转载来源:https://www.cnblogs.com/tonyc/p/6407318.html 今后开始学习OpenCV 1:OpenCV学习笔记 作者:优快云 数量:55篇博文 网址:http://blog.csdn.net/column/details/opencv-manual.html 2:部分OpenCV的函数解读和原理解读 作者...

wuling129的专栏 248

linux下安装完opencv哪些可以删除

Linux删除文件的命令是rm命令。2、我用opencv 1 是在VS2008,不需要下CMAKE,我用CMAKE 安装OPENCV 0的时候,没有遇到这样的问题。5、然后给脚本文件运行权限,一般755就OK,如果完全是自己的私人电脑,也不做服务器什么的,给777的权限问题也不大(具体权限含义参考chmod指令的介绍,就不赘述了):chmod 755 ./*.py 然后执行。当然,有些软件解压后有安装脚本,这时,执行安装脚本时,可能会执行文件夹复制到其他文件夹的命令,这时,删除该解压文件夹是可以的。

aoxiangchina的博客 235

OpenCV学习笔记四-image的一些整体操作

title: OpenCV学习笔记四-image的一些整体操作 categories: 编程 date: 2019-08-08 12:50:47 tags: OpenCV image的一些操作 s////P4 image的一些整体操作 #include<iostream> #include<opencv2/opencv.hpp> using namespace std...

weixin_42376458的博客 558
上一篇: Ubuntu安装中文输入法
下一篇: Ubuntu平台使用aarch64-Linux交叉编译opencv库并移植RK3588S边缘端
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没有余地 Meiyouyudi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值