【图像处理】openCV库教程
openCV 基础学习
with:于士琪openCV基础
env:opencv3.4.0+vc2017集成开发环境
图像的表示:矩阵
1. 灰度矩阵 <br>
2. 彩色(多通道)如RGB图像,RGB图像的通道顺序是BGR
Mat
class CV_EXPORTS Mat
	{
	public:
	//一系列函数
	...
	/* flag 参数中包含许多关于矩阵的信息,如:
	-Mat 的标识
	-数据是否连续
	-深度
	-通道数目
	*/
	int flags;
	//矩阵的维数,取值应该大于或等于 2
	int dims;
	//矩阵的行数和列数,如果矩阵超过 2 维,这两个变量的值都为-1
	int rows, cols;
	//指向数据的指针
	uchar* data;
	//指向引用计数的指针
	//如果数据是由用户分配的,则为 NULL
	int* refcount;
	24
	//其他成员变量和成员函数
	...
	};
创建Mat对象(构造方法):
- Mat M(3,2,CV_8UC3,Scalar(0,0,255));
//创建一个行数为3,列数为2的图像,图像元素是8位无符号整数,3个通道,初始值为0,0,255,为全红 - Mat对象的type是:CV_8UC1,CV_16SC1,…,CV_64FC4 等
 - create()方法
 - at()方法:读矩阵中某个像素,或对某个元素赋值
 
    uchar value = grayim.at<uchar>(i,j);//读出第 i 行第 j 列像素值
    grayim.at<uchar>(i,j)=128; //将第 i 行第 j 列像素值设置为 128
- 迭代器使用 MatIterator
 
#include<iostream>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main() {
	Mat g(600, 800, CV_8UC1);
	Mat c(600, 800,CV_8UC3);
	MatIterator_<uchar> git, gend;
	MatIterator_<Vec3b> cit, cend;
	for (git = g.begin<uchar>(), gend = g.end<uchar>();git != gend;++git) {
		*git = rand() % 255;
	}
	for (cit = c.begin<Vec3b>(), cend = c.end<Vec3b>();cit != cend;++cit) {
		(*cit)[0] = rand() % 255;
		(*cit)[1] = rand() % 255;
		(*cit)[2] = rand() % 255;
	}
	imshow("g", g);
	imshow("c", c);
	waitKey(0);
	return 0;
}
选取图像局部区域:是浅复制,注意复制前后共享内存区域。
i. 单行、列选取
row()/col()Mat Mat::row(int i) const
Mat Mat::col(int j) const
ii. 多行、多列
Range类:class Range
{
public:
int start, end; //从start行(列)到end行(列),左闭右开 static .. all(); //all方法,静态方法,表示所有的行、列 };
如:
Mat A = Mat::eye(10,10,CV_32S);
//提取第一列到第三列
Mat B = A(Range::all(),Range(1,3));
//提取第一行到第三行
Mat C = A(Range(1,3),Range::all());Mat_类:Mat类的封装:
使用 Mat_类,那么就可以在变量声明时确定元素的类型,访问元素时不再需要指定元素类型,即使得代码简洁
图像读写:读写图像文件:
- imread
 
Mat imread(const string& filename, int flags=1 );
	imread()函数返回的是 Mat 对象.
	如果读取文件失败,则会返回一个空矩阵,即 Mat::data 的值是 NULL。执行 imread()之后,需要检查文件是否成功读入,可以使用 Mat::empty()函数进行检查。
			flag 参数值有三种情况:
			  flag>0,该函数返回 3 通道图像,如果磁盘上的图像文件是单通道的灰度图像,则会被强制转为 3 通道;
			  flag=0,该函数返回单通道图像,如果磁盘的图像文件是多通道图像,则会被强制转为单通道;
			  flag<0,则函数不对图像进行通道转换。
- imwrite
 
    bool imwrite(const string& filename, InputArray image,const vector<int>& params=vector<int>())
- 读入一副图像,然后对图像进行 Canny 边缘操作:
 
    #include<iostream>
    #include<opencv2\opencv.hpp>
    using namespace std;
    using namespace cv;
    int  main() {
    	Mat im = imread("C:\\Users\\duye\\Desktop\\2.jpg",1);
	if (im.empty()) {
		cout << "Can not load image!" << endl;
		return -1;
	}
	Mat result;
	Canny(im, result, 50, 100);
	imwrite("C:\\Users\\duye\\Desktop\\1.jpg",result);
	return 0;
    }
视频操作:
- 读视频:
VideoCapture 既可以从视频文件读取图像,也可以从摄像头读取图像
从文件/视频读视频: 
    #include <iostream>
    #include "opencv2/opencv.hpp"
    using namespace std;
    using namespace cv;
    int main(int argc, char** argv)
    {
    //打开视频文件
        VideoCapture cap("video.short.raw.avi");
        //根据摄像头ip 获取实时视频流
        //注意这里不再使用定义了的返回的视频流,直接使用摄像头ip就好
        //String videoUrl = "...";
        //VideoCapture cap;
        //cap.open(videoUrl);
        //检查是否成功打开
        if(!cap.isOpened())
        {
            cerr << "Can not open a camera or file." << endl;
            return -1;
        }
        Mat edges;
        //创建窗口
        namedWindow("edges",1);
        for(;;)
        {
            Mat frame;
            //从 cap 中读一帧,存到 frame
            cap >> frame;
            //如果未读到图像
            if(frame.empty())
                break;
            //将读到的图像转为灰度图
            cvtColor(frame, edges, CV_BGR2GRAY);
            //进行边缘提取操作
            Canny(edges, edges, 0, 30, 3);
            //显示结果
            imshow("edges", edges);
            //等待 30 秒,如果按键则推出循环
            if(waitKey(30) >= 0)
                break;
        }
        //退出时会自动释放 cap 中占用资源
        return 0;
    }
- 写视频
读取摄像头视频,写入文件中保存 
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    using namespace cv;
    void main()
    {
    	String url = "http://192.168.1.1:8080";
	VideoCapture cap();
	cap.open(url);
	double rate = 25.0;//视频的帧率
	Size videoSize(1280,960);
	VideoWriter writer("VideoTest.avi", CV_FOURCC('M', 'J', 'P', 'G'), rate, videoSize);
	Mat frame;
	while (capture.isOpened())
	{
		capture >> frame;
		writer << frame;
		imshow("video", frame);
		if (waitKey(20) == 27)//27是键盘摁下esc时,计算机接收到的ascii码值
		{
			break;
		}
	}
    }
后续我会给出目前比较流行的使用opencv实现人脸识别的具体实现。以上。
【图像处理】openCV库教程的更多相关文章
- python调用opencv库教程
		
OpenCV安装pip install --upgrade setuptoolspip install numpy Matplotlibpip install opencv-python OpenCV ...
 - 【OpenCV新手教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑
		
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/23184547 作者:毛星云(浅墨) ...
 - 学习opencv中文版教程——第二章
		
学习opencv中文版教程——第二章 所有案例,跑起来~~~然而并没有都跑起来...我只把我能跑的都尽量跑了,毕竟看书还是很生硬,能运行能出结果,才比较好. 越着急,心越慌,越是着急,越要慢,越是陌生 ...
 - 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置
		
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/19809337 作者:毛星云(浅墨 ...
 - OpenCV库文件介绍
		
以前都是直接用opencv,都没有仔细研究过,这次把库文件都介绍一下. 1.build和source 当我们安装完opencv中,你会发现在opencv文件夹中有两个文件夹,build和source, ...
 - OpenCV 新手教程 之环境配置 + 图片匹配 matchTemplate
		
1.什么是OpenCV OpenCV的全称是:Open Source Computer Vision Library. OpenCV是一个基于(开源)发行的跨平台计算机视觉库,能够执行在Linux.W ...
 - 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)
		
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨) ...
 - Qt中添加OpenCV库
		
配置在Qt中的OpenCV,看了很多“教程”,最终成功.记一下过程. 本机配置: window7 32位系统: qt-opensource-windows-x86-mingw492-5.5.1: Op ...
 - 【OpenCV新手教程之十二】OpenCV边缘检測:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
		
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...
 
随机推荐
- macOS下appstore提示未能完成该操作的解决办法
			
macOS下App Store下载软件,提示:未能完成该操作.(com.apple.commerce.client 错误 500.) 解决办法: 在终端输入 defaults write com.ap ...
 - 串行FLASH文件系统FatFs---转自野火论坛
			
为了支持长文件名,需要用到FATFS源码中的cc936.c的两个函数ff_convert,ff_wtoupper:这里面直接用了两个大数组(127KB)来做unicode转gbk(OEM)的对照表,这 ...
 - JenKins自动化构建部署流程参考
			
Jenkins工作流程 程序员提交代码到Git/SVN仓库,触发钩子程序向 JenKins 进行通知,Jenkins 调用Git/SVN插件获取源码,调用Maven打包为war包,调用Deploy t ...
 - 抽取非基本验证到规则文件 - A2D规则引擎
			
基本验证与业务验证,基本验证就是始终保持不变的验证规则,可以通过如下硬编码实现: public class Order { [Required] [Range(")] public deci ...
 - 2019年第一天——使用Visual Studio 2019 Preview创建第一个ASP.Net Core3.0的App
			
一.前言: 全文翻译自:https://www.talkingdotnet.com/creating-first-asp-net-core-3-0-app-visual-studio-2019/ Vi ...
 - 针对2017年淘宝开放平台应用整改被封停或强制入塔政策实现不入塔不模糊正常调用API的解决方案
			
淘宝开放平台入驻先是限制上架,提高入驻资质,然后又模糊化R2信息,强制入塔,如今开始大规模整改应用. 此次整改势必导致很大一批个人开发的应用无法使用. 在此本人有偿提供正常调用淘宝开放平台API的解决 ...
 - Achievements
			
看了Suma,觉得懂了85%以上. 两个月可以学这么多.方法是不懂的就学就行了. 最近学了:字符串,网络流,线段树,斯特林反演,多项式与生成函数,一些数论等.
 - IBM的淘汰之路
			
BM曾经在计算领域独领风骚,但是90年被PC产业链上的微软.英特尔等厂商围殴,遭遇最严重的危机; 今天在云计算市场,IBM曾在遭遇同样的危机,这一次不知道它能否安然度过; IBM收购红帽转向混合云,是 ...
 - PS打造油画般的风景人像
 - mysql_建表
			
建表 某字段多个默认值 创建表时,对多选多的字段设置两个以上的默认值时,两个默认值之间用逗号','隔开,不能加空格. create table student2( id int not null, n ...