先来三个案例:
案例一:图片腐蚀效果
main.cpp
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
int main(int argc, const char * argv[]) {
//第一步:加载图片
Mat mat_image_src = imread("/Users/alange/Desktop/OpenCV/Images/strawberry.png");
if( mat_image_src.empty() ){
cout << "打不开或者没有该图片" << std::endl;
return -1;
}
//第二步:进行腐蚀操作
//参数一:腐蚀类型->矩形方式
//参数二:腐蚀大小->范围(腐蚀单位大小)->腐蚀程度大小
Mat mat_element = getStructuringElement(MORPH_RECT, Size(20, 20));
//开始腐蚀
Mat mat_image_dst;
//参数一:原始图片
//参数二:腐蚀之后的图片
//参数三:腐蚀范围
erode(mat_image_src, mat_image_dst, mat_element);
//第三步:显示图片
imshow("图片腐蚀", mat_image_dst);
waitKey();
return 0;
}
案例二:图片模糊效果
main.cpp
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
int main(int argc, const char * argv[]) {
//第一步:加载图片
Mat mat_image_src = imread("/Users/alange/Desktop/OpenCV/Images/strawberry.png");
if( mat_image_src.empty() ){
cout << "打不开或者没有该图片" << std::endl;
return -1;
}
Mat mat_image_dst;
blur(mat_image_src, mat_image_dst, Size(20, 20));
//第三步:显示图片
imshow("图片模糊", mat_image_dst);
waitKey();
return 0;
}
案例三:图片边缘检测
main.cpp
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
int main(int argc, const char * argv[]) {
//第一步:加载图片
Mat mat_image_src = imread("/Users/alange/Desktop/OpenCV/Images/strawberry.png");
if( mat_image_src.empty() ){
cout << "打不开或者没有该图片" << std::endl;
return -1;
}
//创建和mat_image_src同样大小的OpenCV图片(Mat)
Mat mat_image_dst;
mat_image_dst.create(mat_image_src.size(), mat_image_src.type());
//将图片进行灰度处理
Mat mat_image_gray;
cvtColor(mat_image_src, mat_image_gray, COLOR_BGR2GRAY);
//使用3*3内核来降噪处理
Mat mat_image_edge;
blur(mat_image_gray, mat_image_edge, Size(3, 3));
//进行Canny算子处理
Canny(mat_image_edge, mat_image_edge, 3, 9, 3);
//第三步:显示图片
imshow("边缘检测", mat_image_edge);
waitKey();
return 0;
}
OpenCV基本数据结构
1、学习OpenCV基本结构->Mat结构
1、我们可以简单认为Mat是OpenCV中的图片
2、矩阵数据结构
3、Mat同时是一个C++类
2、总结一下->Mat结构->创建方式有哪些?
方式一:创建Mat->构造方法创建
1、Mat mat_image_dst(mat_image_src.rows, mat_image_src.cols, CV_8UC3);
2、Mat mat_image_dst(Size(mat_image_src.rows, mat_image_src.cols), CV_8UC3);
3、Mat mat_image_dst(200, 200, CV_8UC3, Scalar(255, 0, 0));
4、Mat mat_image_dst(Size(300, 300), CV_8UC3, Scalar(255, 0, 0));
5、Mat mat_image_dst(mat_image_src);
6、Mat mat_image_dst(mat_image_src, Rect(0, 0, 100, 100));
……
方式二:创建Mat->create成员函数(方法)
代码如下
Mat mat(100, 100, CV_8UC3, Scalar(0, 0, 255));
mat.create(50, 50, CV_8UC(3));
分析代码
运行结果:发现一片漆黑,没有任何颜色(存在问题)
注意事项:这个create函数起始不能够为Mat矩阵设置初始值,但是可以在尺寸发生改变的时候重新为矩形数据开辟内存空间
方式三:创建Mat->Matlab初始化(库)
代码如下
Mat mat = Mat::eye(100, 100, CV_64F);
Mat mat = Mat::ones(100, 100, CV_64F);
Mat mat = Mat::zeros(100, 100, CV_64F);
分析代码
eye:表示缩放操作
ones:表示任何一个数组然后初始化Mat
zeros:表示用这个函数可以创建一个作为参数的一个矩阵初始化器->初始化器(默认值:0)
方式四:对小Mat矩阵通过都好分隔符方式初始化(直接赋值方式)
代码如下
Mat mat = (Mat_<int>(2, 2) << 0, 3, -1, 0);
方式五:通过clone函数和copyTo函数作为一个已经存在Mat对象,创建一个新的Mat对象
代码如下
Mat mat_image_clone = mat_image_src.clone();
Mat mat_image_clone;
mat_image_src.copyTo(mat_image_clone);
……
3、OpenCV开发中->常用数据结构
3.1 第一个->Point类->表示点
第一种:二维点
Point2f p2f(100, 100);
第二种:三维点
Point3f p3f(100, 100, 100);
3.2 第二个->Scalar类->常用于表示颜色RGB值,就是三个参数
代码如下
Scalar(0, 0, 255);
分析代码
参数一:蓝色->B
参数二:绿色->G
参数三:红色->R
扩展知识
Scalar祖宗是Matx
Matx设计目的:用于存储小图片(像素点->RGB、BGR)->小矩阵(轻量级Mat)
做OpenCV开发将Mat->Matx,Matx->Mat
3.3 第三个->Size类->表示尺寸大小(说白了:表示图片大小)
Size(100, 100);
3.4 第四个->Rect类->矩形类型(长方形、正方形等等…)
Mat表示矩阵
Rect rect(0, 0, 100, 100);
常用函数
rect.size()->返回矩形宽高(区域)
rect.area()->返回矩形面积->width * height
rect.contains()->判断某个点是否在矩形范围之内
rect.tl()->返回左上角点的坐标
rect.br()->返回右下角点的坐标
rect1 & rect2 ->表示两个矩形交集
rect1 | rect2 ->表示两个矩形并集
rect + Point(50, 50)->表示矩形平移操作
rect + Size(50, 50)->表示矩形缩放操作
……
4、Vec类?->核心->存储像素点
Matx:是轻量级Mat类(专门用于存储小图片->小内存)
Vec本身是一个模版类(泛型类:定义的时候是没有类型的,需要客户端动态指定类型)
typedef Vec<uchar, 2> Vec2b;
类型:uchar类型(无符号char类型)
个数(元素个数):2个
typedef Vec<uchar, 3> Vec3b;->RGB像素点存储
类型:uchar类型(无符号char类型)
个数(元素个数):3个
typedef Vec<uchar, 4> Vec4b;->ARGB像素点存储
类型:uchar类型(无符号char类型)
个数(元素个数):4个
一个像素点:->搞了Mat类
总结:源码里面Vec类->开辟了一块内存空间(数组,大小一开始就会指定)
5、Range类->范围大小
OpenCV开发->常用函数
1、第一个函数->cvtColor函数->颜色空间转换?
类型之间转换
RGB和BGR区别->内存存储顺序问题(不一样)
2、ellipse函数?
写一个案例->加深理解->绘制一个椭圆
绘制集合图像:圆、椭圆等等…
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
#define WINDOWS_WIDTH 240
//绘制椭圆
void drawEllipse(Mat &mat_image, double angle){
//参数一:图片(画板)
//参数二:中心点
//参数三:轴大小(主轴大小)->半径
//参数四:旋转角度
//参数五:起始角度
//参数六:结束角度
//参数七:椭圆颜色
//参数八:类型(如果小于表示实心圆、如果大于等于0表示空心圆)
//如果这个大于0的,那么椭圆外围线大小
ellipse(mat_image,
Point2i(WINDOWS_WIDTH/2, WINDOWS_WIDTH/2),
Size2i(WINDOWS_WIDTH/4, WINDOWS_WIDTH/16),
angle,
0,
360,
Scalar(0, 0, 255),
-1);
}
int main(int argc, const char * argv[]) {
//第一步:创建一张图片->空白图片
Mat mat_image = Mat::zeros(WINDOWS_WIDTH, WINDOWS_WIDTH, CV_8UC3);
// Mat mat_image(WINDOWS_WIDTH, WINDOWS_WIDTH, CV_8UC3, Scalar(255, 255, 255));
//第二步:给我们的图绘制集合图形 -- 绘制椭圆
drawEllipse(mat_image, 0);
//第三步:显示图片
namedWindow("图片");
imshow("图片", mat_image);
waitKey();
return 0;
}
3、circle函数?
写一个案例->加深理解
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
#define WINDOWS_WIDTH 240
// 绘制圆
void drawCircle(Mat &mat_image, Point2i center){
//参数一:图片(画板)
//参数二:中心点
//参数三:半径
//参数四:圆的颜色
//参数五:类型(如果小于表示实心圆、如果大于等于0表示空心圆)
//如果这个大于0的,那么圆外围线大小
circle(mat_image, center, WINDOWS_WIDTH / 4, Scalar(0, 0, 255), 5);
}
int main(int argc, const char * argv[]) {
//第一步:创建一张图片->空白图片
Mat mat_image = Mat::zeros(WINDOWS_WIDTH, WINDOWS_WIDTH, CV_8UC3);
// Mat mat_image(WINDOWS_WIDTH, WINDOWS_WIDTH, CV_8UC3, Scalar(255, 255, 255));
//第二步:绘制圆
drawCircle(mat_image, Point2i(WINDOWS_WIDTH / 2, WINDOWS_WIDTH / 2));
//第三步:显示图片
namedWindow("图片");
imshow("图片", mat_image);
waitKey();
return 0;
}
…很多函数->后面继续学习
网友评论