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

资产监测设备中130dBm的GPS信号注入天线端口,C/N0一般是多少?

笔者的团队一直从事于资产监测设备的开发,在开发过程中,涉及到很多细节的问题,针对新入职的同事来说较为陌生。同时,在团队外,还有需要对智能硬件终端开发感兴趣的用户。基于此背景下,笔者将在下面的内容主要介绍资产监测设备以及对设备中的GPS相关的问题:130dBm的GPS信号注入天线端口,C/N0一般是多少?作出详细的解答。 资产监测设备概述: 资产监测设备是基于物联网通信技术基础上的智能硬件终端,其主要作用是帮助用户监测资产在仓库、运输途中、交付整个流通环节中,提供资产的实时位置与状态参数。用户只需要登录资产

瑞奇聊通信模组 1229

固定翼飞行器建模(一)——六自由度动力学

前两期文章讲完了气动力和气动力矩的模型,本期将来讲解一下六自由度部分的动力学与运动学方程。

2302_80148937的博客 1万+

imgcodecs.hpp源码

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

zz12306zz的博客 1809

涨薪技术|Kubernetes(k8s)环境部署实战

这两者都是在/etc/docker/daemon.json里修改的,所以我们一起配置了就好了,首先执行下述命令编辑daemon.json:​​​​​​​。安装完成后,可以使用以下命令来查看dashboard访问的端口号​​​​​​​。网络插件CNI也是以容器的方式进行启动​​​​​​​。安装完成后可以检查是否拉取了对应的容器​​​​​​​。再使用以下命令进行安装:​​​​​​​。打开后输入以下内容:​​​​​​​。安装1.19.0版本​​​​​​​。修改IP地址:​​​​​​​。

m0_60889254的博客 1085

Opencv c++(图像处理)

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

qq_62330330的博客 1万+

STM32F407硬件SPI驱动ADS1220避坑指南:从寄存器读不到数据到采样值异常的完整解决流程

本文详细解析了STM32F407硬件SPI驱动ADS1220的常见问题与解决方案,包括SPI配置、寄存器读取异常、采样值优化等关键环节。通过CubeMX配置技巧和Keil调试经验,帮助开发者快速排查从通信失败到数据异常的各种问题,实现高精度数据采集系统的稳定运行。

weixin_26878995的博客 158

通过 MATLAB/Simulink + Simscape Battery,构建了锂电池老化模型与容量衰减仿真系统

本文基于MATLAB/Simulink平台,构建锂电池老化模型与容量衰减仿真系统,研究储能电池健康管理技术。通过搭建电化学-老化耦合模型,模拟循环和日历老化机制,分析温度、充放电倍率、DOD等因素对电池寿命的影响。系统实现了SOH在线估计和RUL预测功能,仿真了标准日历老化、高倍率循环和峰谷套利等典型工况下的电池衰减行为。结果表明:高温和深充放会显著加速电池老化,而精准的SOH管理可提升储能系统经济性30%以上。文章还探讨了数字孪生、机器学习等高级优化方向,为储能系统长周期运营提供技术支撑。

xiaoheshang_123的博客 398

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

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

qq_30150579的博客 1311

WS2812和homeassistant握手

本文学习了WS2812和homeassistant握手,后期会分享更多有趣物联网的操作从而实现对外部世界进行感知,充分认识这个有机与无机的环境,科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。...

vor234的博客 811

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

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

总裁余(余登武)博客 6832

太空安全卫士:基于YOLOv5的空间态势感知系统(实现轨道碰撞预警与太空环境保护)

做完这个项目,你会发现自己完整走过了“数据采集→标注→模型训练→功能集成→界面开发”的毕设全流程,这不仅是技术能力的证明,更是对“技术守护宇宙安全”这一理念的实践。答辩时,你可以重点讲这几点:系统解决了航天监测的哪些痛点、YOLOv5在太空目标检测中的性能优势、系统未来能怎么优化(比如对接航天监测网络、实现实时轨道预测)。未来,这个系统还能往“更智能”的方向发展:比如结合轨道计算预测碰撞风险、开发移动端APP让天文爱好者参与太空垃圾上报、在航天任务中实现全自动避障决策……想象空间很大。

m0_71589036的博客 90

【WRF-Chem】预处理工具(Preprocessors)总结

预处理工具(Preprocessors)总结

WW、forever的博客 1180

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

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

OpenCV学习笔记大集锦

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

Leo的博客 6662

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

OpenCV - 学习笔记系列博文

移动的130 1474

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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、付费专栏及课程。

余额充值