图像存储容器Mat
Mat类用于保存矩阵类型的数据的信息,包括:向量、矩阵、灰度或彩色图像等。
Mat类分为矩阵头和指向存储数据的矩阵指针 两部分。
Mat img;
img = imread("D:/OpenCV/good.jpg");
if (img.empty())
{
cout << "error!";
}
Mat类的继承
Mat
Mat a = Mat_<double>(3, 3);
Mat类的构造与赋值
仅写一种:
Mat img;
img = imread("D:/OpenCV/good.jpg");
Mat类的运算
乘法:默认都是size(3,3)的矩阵
Mat a,b,c,d, j, m;
double k;
j = c * d;
k = a.dot(b);
m = a.mul(b);
其中:
j = c * d;//做的是乘法
k = a.dot(b);//做的是内积,注意这里,不论输入的两个Mat类矩阵的维数是多少,都会将Mat类的矩阵
拓展成一个行向量和一个列向量
m = a.mul(b);//作对应位乘法
Mat类的元素读取
at:读取单通道或三通道的位置元素
Vec3b vec = img.at<Vec3b>(0,0);
int first = (int)vec.val[0];
cout << first;
指针
视频加载与摄像头调用
VideoCapture类
构造一个能够读取和处理视频文件的视频流,具体读取什么文件需要通过open()函数指出,或在给出声明变量的同时也将视频数据赋值给变量(如下代码所示)。
视频加载
VideoCapture video("D:/OpenCV/hxy.mp4");
if (video.isOpened())
{
cout << video.get(CAP_PROP_FRAME_WIDTH);
}
while (1)
{
Mat frame;
video >> frame;
imshow("video", frame);
waitKey(1000 / video.get(CAP_PROP_FPS));
}
摄像头调用
VideoCapture还可以直接调用摄像头。
查找设备的硬件ID:一般默认是0
VideoCapture camera(0);
while (1)
{
Mat frame;
camera >> frame;
imshow("video", frame);
waitKey(1);//如果我不加这一句,就不会出图像,加上以后也不卡;
}
数据保存
imwrite()函数
imwrite(filename,arrayname);
Mat img,output;
img = imread("D:/OpenCV/ycy2.jpg");
if (img.empty())
{
cout << "error!";
}
imshow("ycy", img);
Canny(img, output, 2, 4, 3);
imshow("sorry", output);
imwrite("sorry.jpg", output);
VideoWriter()函数:用于保存视频
参考文件:
1、实现代码
#include<opencv2\opencv.hpp>
#include<iostream>
/*-------------命名空间----------------*/
using namespace std;
using namespace cv;
/*-------------函数声明----------------*/
/*-------------全局变量----------------*/
/*--------------主函数-----------------*/
int main()
{
Mat img,output;
img = imread("D:/OpenCV/ycy2.jpg");
if (img.empty())
{
cout << "error!";
}
imshow("ycy", img);
VideoCapture camera(0);
while (1)
{
Mat frame;
camera >> frame;
Canny(frame, output, 1, 2);
imshow("video", frame);
imshow("oooo", output);
waitKey(1);
}
waitKey(0);
return 0;
}