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对象(构造方法):

  1. Mat M(3,2,CV_8UC3,Scalar(0,0,255));

    //创建一个行数为3,列数为2的图像,图像元素是8位无符号整数,3个通道,初始值为0,0,255,为全红
  2. Mat对象的type是:CV_8UC1,CV_16SC1,…,CV_64FC4 等
  3. create()方法
  4. at()方法:读矩阵中某个像素,或对某个元素赋值
    uchar value = grayim.at<uchar>(i,j);//读出第 i 行第 j 列像素值
grayim.at<uchar>(i,j)=128; //将第 i 行第 j 列像素值设置为 128
  1. 迭代器使用 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; }
  1. 选取图像局部区域:是浅复制,注意复制前后共享内存区域。

    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());
  2. Mat_类:Mat类的封装:

    使用 Mat_类,那么就可以在变量声明时确定元素的类型,访问元素时不再需要指定元素类型,即使得代码简洁

图像读写:读写图像文件:

  1. 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,则函数不对图像进行通道转换。
  1. imwrite
    bool imwrite(const string& filename, InputArray image,const vector<int>& params=vector<int>())
  1. 读入一副图像,然后对图像进行 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; }

视频操作:

  1. 读视频:

    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;
}
  1. 写视频

    读取摄像头视频,写入文件中保存
    #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库教程的更多相关文章

  1. python调用opencv库教程

    OpenCV安装pip install --upgrade setuptoolspip install numpy Matplotlibpip install opencv-python OpenCV ...

  2. 【OpenCV新手教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/23184547 作者:毛星云(浅墨) ...

  3. 学习opencv中文版教程——第二章

    学习opencv中文版教程——第二章 所有案例,跑起来~~~然而并没有都跑起来...我只把我能跑的都尽量跑了,毕竟看书还是很生硬,能运行能出结果,才比较好. 越着急,心越慌,越是着急,越要慢,越是陌生 ...

  4. 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/19809337 作者:毛星云(浅墨 ...

  5. OpenCV库文件介绍

    以前都是直接用opencv,都没有仔细研究过,这次把库文件都介绍一下. 1.build和source 当我们安装完opencv中,你会发现在opencv文件夹中有两个文件夹,build和source, ...

  6. OpenCV 新手教程 之环境配置 + 图片匹配 matchTemplate

    1.什么是OpenCV OpenCV的全称是:Open Source Computer Vision Library. OpenCV是一个基于(开源)发行的跨平台计算机视觉库,能够执行在Linux.W ...

  7. 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨)  ...

  8. Qt中添加OpenCV库

    配置在Qt中的OpenCV,看了很多“教程”,最终成功.记一下过程. 本机配置: window7 32位系统: qt-opensource-windows-x86-mingw492-5.5.1: Op ...

  9. 【OpenCV新手教程之十二】OpenCV边缘检測:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...

随机推荐

  1. .Net Core 在 Linux-Centos上的部署实战教程(三)

    绑定域名,利用Nginx反向代理来操作 1.安装Nginx yun install nginx 安装成功 2.启动nginx service nginx start 报报报错了~~·      运行 ...

  2. layui轮播中箭头不起作用问题

    layui轮播中箭头不起作用问题 layui轮播插件在使用中发现箭头不起作用其他都合适,是什么原因造成的呢?发现单独提出layui中的demo是合适的,通过仔细慢慢的寻找,发现layui.use('c ...

  3. IT江湖--这个冬天注定横尸遍野

    今年江湖大事繁起,又至寒冬,冻的不仅是温度,更是人心. 这两天上班途中看到多个公众号和媒体发了很多 "XXX公司裁员50%" 等等诸如此类的文章,也真是撼动人心.寒冬,比以往来的更 ...

  4. Mysql多实例添加到开机自启的方法

    Mysql多实例配置成功后,想让配置成开机自启. 首先看一下Linux启动的知识点,顺序如下. 1 加载内核2 执行init程序3 /etc/rc.d/rc.sysinit   # 由init执行的第 ...

  5. 用Flask+Redis维护代理池

    GitHub:https://github.com/LXL-YAN/ProxyPool 视频讲解:https://www.bilibili.com/video/av19057145/?p=17

  6. 爬虫——scrapy框架

    Scrapy是一个异步处理框架,是纯Python实现的爬虫框架,其架构清晰,模块之间的耦合程度低,可拓展性强,可以灵活完成各种需求.我们只需要定制几个模块就可以轻松实现一个爬虫. 1.架构  Scra ...

  7. 【转】实现Nginx代理WSS协议

    https://blog.csdn.net/chopin407/article/details/52937645 后来看到了官网的教程(http://nginx.org/en/docs/http/we ...

  8. 搞站思路 <陆续完善中>

    只提供思路经验分享.不提供日站方法....一般站点那里最容易出现问题 入手思路: 主站一般都很安全.一般从二级域名下手 多看看那些大站新出来的测试分站点 猜路径别忘了google 考虑看站点下的rob ...

  9. Es6数值拓展

    Es6数值拓展 一,Number扩展 1,ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示. 将0b和0o前缀的字符串数值转为十进制,要使用Number方法 N ...

  10. IdentityServer4【QuickStart】之设置和概述

    设置和概述 有两个基本的方式来开启一个新的IdentityServer项目: 从头开始 从asp.net Identity模板开始 如果你从头开始,我们提供了一些基于内存中构建的存储,所以你不必一开始 ...