OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。
图像的初级操作
1.图像的表示
在计算机看来,一副图像只是一堆亮度各异的点。一副尺寸为M×N的图像可以用一个M×N
的矩阵来表示,矩阵元素的值表示这个位置上的像素的亮度,一般来说像素值越大表示该点越亮。
一般来说,灰度图用二维矩阵表示
彩色(多通道)图像用三维矩阵(M×N×3)表示,RGB图像的通道顺序为BGR
2.Mat类
Mat类能够自动管理内存,不需要我们手动开辟空间,也不需要立即释放空间。
Mat类由矩阵头和指向存储所有像素值的矩阵指针构成。
Mat类表示一个n维的密集数值单通道或多通道数组,可用于存储实数或复数值的向量和矩阵、灰度或彩色图像等。
Mat类代码
class CV_EXPORTS Mat
{
public:
int flags; // 标志位
int dims; // 数组的维数
int rows, cols // 行与列的数量
uchar *data; // 指向数据的指针
int * refcount; // 指针的引用计数器
}
Mat 类创建
Mat img; // 创建无初始化矩阵
Mat img1(20,10,CV_8UC1); // 创建20行10列类型为8位的单通道矩阵
Mat img2(Size(20,10),CV_8UC3); // 创建大小为20*10类型为8位的三通道矩阵
Mat img3(20,10,CV_8UC3,Scalar(0,255,0)); // 创建10*20的8位三通道矩阵
Mat img4(20,10,CV_8UC1,Scalar(255)); // 创建大小为10*20的8位单通道矩阵
Mat img5(img4); // img4赋值给img5,共享数据对象
Mat 类赋值拷贝
Mat img(100,200,CV_8UC3,Scalar(0,255,0));
Mat img2(img);//和原图像指向同一个数据块
Mat img3=img;//和原图像指向同一个数据块
Mat img4=img.clone(); //原图像的副本
Mat img 5;
img.copyTo(img5); // 原图像的副本
3.图像显示
代码如下:
#include <opencv2\opencv.hpp>
#include <opencv2\imgproc.hpp>
using namespace cv;
int main()
{
// 读入一张图片
Mat img = imread("E:\\图片\\03.jpg");
// 创建一个名为"图片"窗口
namedWindow("图片");
// 在窗口中显示游戏原画
imshow("图片", img);
// 一直显示
waitKey(0);
}
4.模糊操作
#include <opencv2\opencv.hpp>
#include <opencv2\imgproc.hpp>
using namespace cv;
int main()
{
// 载入原始图
Mat img = imread("E:\\图片\\03.jpg");
// 创建一个名为 "游戏原画"窗口
namedWindow("游戏原画");
// 在窗口中显示游戏原画
imshow("游戏原画", img);
// 模糊操作
Mat dstImage;
blur(img, dstImage, Size(15, 15));
imshow("模糊操作", dstImage);
// 让图片一直显示
waitKey(0);
}
5.边缘检测
#include <opencv2\opencv.hpp>
#include <opencv2\imgproc.hpp>
using namespace cv;
int main()
{
// 载入原始图
Mat img = imread("E:\\图片\\02.jpg");
// 创建一个名为 "游戏原画"窗口
namedWindow("游戏原画");
// 在窗口中显示游戏原画
imshow("游戏原画", img);
Mat dstImage,edge,grayImage;
dstImage.create(img.size(), img.type());
// 将原图变为灰度图片
cvtColor(img, grayImage, COLOR_BGR2GRAY);
// 降噪
blur(grayImage,edge,Size(5,5));
// 运行Canny算子
Canny(edge, edge, 3, 9, 3);
// 显示
imshow("边缘检测", edge);
// 让图片一直显示
waitKey(0);
}