【图像处理】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对象(构造方法):

  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
  5. 迭代器使用 MatIterator

    ```

    include

    include

    using namespace std;

    using namespace cv;

int main() {

Mat g(600, 800, CV_8UC1);

Mat c(600, 800,CV_8UC3);

MatIterator_

}

6. 选取图像局部区域:是浅复制,注意复制前后共享内存区域。<br>
    i. 单行、列选取
        row()/col()<br>
     ```
        Mat Mat::row(int i) const
        Mat Mat::col(int j) const
    ```
    ii. 多行、多列<br>
        Range类:<br>

    ```
        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());

    ```
7. Mat_类:Mat类的封装:<br>
        使用 Mat_类,那么就可以在变量声明时确定元素的类型,访问元素时不再需要指定元素类型,即使得代码简洁

### 图像读写:读写图像文件:<br>

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,则函数不对图像进行通道转换。
2. imwrite
bool imwrite(const string& filename, InputArray image,const vector<int>& params=vector<int>())

3. 读入一副图像,然后对图像进行 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 既可以从视频文件读取图像,也可以从摄像头读取图像<br>
从文件/视频读视频:
#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;
}

2. 写视频<br>
读取摄像头视频,写入文件中保存
#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实现人脸识别的具体实现。以上。

原文地址:https://www.cnblogs.com/duye/p/8641106.html

时间: 2024-08-28 22:56:50

【图像处理】openCV基础使用的相关文章

什么是图像 -- opencv基础

opencv基础篇--到底什么是图像 什么是图像?英语中有两个单词来形容图像,一个是picture,一个是image.这两者虽然是形容同一个东西,但却又有着区别.picture代表实而有物的真实图像:而image代表着计算机中存储的图像,也代表想象中的图像. 而我们更多研究的便是image,计算机图像从广义地可分为矢量图和像素图(位图).矢量图,是由一系列计算机指令描述和记录的一幅图,一幅图可以解为一系列由点.线.面等组成的子图.像素图,则是由很多个点组成的,每个点都是由二进制数据来描述和存储其

图像处理之基础---卷积傅立叶变换中的复数

整个看FFT过程中复数一直很折磨我. 原本的实数的东西通过复数表达很像旋转矩阵用quaternion来表达,尽管旋转vector还是要用matrix来做,但是通过用quaternion表达的旋转意义可以做插值等很多快速的操作,而且内存消耗也小,在做完这些操作之后再转成matrix用就好了. 复数表达也是类似. a+bi = M*(cos(theta)+sin(theta)*i)----极坐标 cos(x) + sin(x)*i = exp(x*i)----欧拉公式 这个用欧拉公式转出来的exp(

图像处理之基础---内积、点积

定义在数学中,数量积(dotproduct;scalarproduct,也称为标量积.点积.点乘)是接受在实数R上的两个矢量并返回一个实数值标量的二元运算.它是欧几里得空间的标准内积.两个矢量a=[a1,a2,…,an]和b=[b1,b2,…,bn]的点积定义为:a·b=a1b1+a2b2+……+anbn使用矩阵乘法并把(纵列)矢量当作n×1矩阵,点积还可以写为:a·b=a^T*b,这里的a^T指示矩阵a的转置. 内积(inner product),又称 数量积(scalar product).

图像处理之基础---卷积,滤波,平滑

/*今天师弟来问我,CV的书里到处都是卷积,滤波,平滑……这些概念到底是什么意思,有什么区别和联系,瞬间晕菜了,学了这么久CV,卷积,滤波,平滑……这些概念每天都念叨好几遍,可是心里也就只明白个大概的意思,赶紧google之~ 发现自己以前了解的真的很不全面,在此做一些总结,以后对这种基本概念要深刻学习了~*/ 1.图像卷积(模板) (1).使用模板处理图像相关概念: 模板:矩阵方块,其数学含义是一种卷积运算. 卷积运算:可看作是加权求和的过程,使用到的图像区域中的每个像素分别于卷积核(权矩阵)

图像处理之基础---二维卷积运算原理剖析

卷积运算(Convolution)是通过两个函数f 和g 生成第三个函数的一种数学算子,表示函数f 与经过翻转和平移与g 的重叠部分的累积.如果将参加卷积的一个函数看作区间的指示函数,卷积还可以被看作是“滑动平均”的推广.假设: f(x),g(x)是R1上的两个可积函数,并且积分是存在的.这样,随着 x 的不同取值,这个积分就定义了一个新函数h(x),称为函数f 与g 的卷积,记为h(x)=(f*g)(x). 两个向量卷积,说白了就是多项式乘法.下面用个矩阵例子说明其工作原理: a和d的卷积就是

OpenCV基础篇——视频显示

Opencv的视频显示,其实质是图片显示,只不过是连续显示不同的图片.其中如果涉及GUI,还要用多线程.现在讲自己所用的视频显示写出来供大家参考,主要涉及opencv在win32和mfc中显示视频. 一:Win32+OpenCV #include "highgui.h" int main() { const char *showwindow= "image";//窗口名字 CvCapture *capture = NULL; capture=cvCaptureFro

OpenCV基础篇——环境搭建

在开始使用opencv的时候第一步就是搭建环境,关于opencv的环境搭建其实很简单,网上也有很多,一般来说才开始学习都会搭建环境很多次,至少我是这样的.这样对问题的排除有很很大的帮助.现在就把我的搭建方式分享一下: 一.opencv+vs2010 1.opencv的获取: 最好从opencv的官网获取,也可以从opencv的官方中文论坛获取:http://wiki.opencv.org.cn/index.php/%E9%A6%96%E9%A1%B5 我使用的是opencv2.4.4版的,基本上

图像处理之基础---卷积模板简介

1.使用模板处理图像相关概念:       模板:矩阵方块,其数学含义是一种卷积运算. 卷积运算:可看作是加权求和的过程,使用到的图像区域中的每个像素分别与卷积核(权矩阵)的每个元素对应相乘,所有乘积之和作为区域中心像素的新值. 卷积核:卷积时使用到的权,用一个矩阵表示,该矩阵与使用的图像区域大小相同,其行.列都是奇数,是一个权矩阵. 卷积示例: 假设3 * 3的像素区域R与卷积核G分别为: 则卷积运算为: R5(中心像素)=R1G1 + R2G2 + R3G3 + R4G4 + R5G5 +

图像处理之基础---卷积模板运算

1.使用模板处理图像相关概念: 模板:矩阵方块,其数学含义是一种卷积运算.      卷积运算:可看作是加权求和的过程,使用到的图像区域中的每个像素分别于卷积核(权矩阵)的每个元素对应相                乘,所有乘积之和作为区域中心像素的新值.      卷积核:卷积时使用到的权用一个矩阵表示,该矩阵与使用的图像区域大小相同,其行.列都是奇数,              是一个权矩阵.      卷积示例:              3 * 3 的像素区域R与卷积核G的卷积运算: