OpenCV学习总结---自己总结版

版权声明:本文为博主原创文章,未经博主允许不得转载。转载请保留出处 https://blog.csdn.net/xuluohongshang/article/details/78893535
好的Opencv初级教程:
文章链接: http://blog.csdn.net/poem_qianmo/article/details/20911629
作者邮箱: happylifemxy@163.com 
写作当前博文时配套使用的OpenCV版本:2.4.8

下载安装cmake生成不同的未编译解决方案或项目
可用于对源码选择不同的的编译器生成不同的解决方案文件,如使用vc12编译器生成后缀为sln的vs2013版解决方案,方案可以包含很多的项目,可以各自编译生成可执行文件如dll或者exe文件,具体操作可访问:
http://blog.csdn.net/poem_qianmo/article/details/21974023

namedWindow:
OpenCV中写代码时节约时间的小常识。其实OpenCV中,不用namedWindow,直接imshow就可以显示出窗口。大家看下文的示例代码就可以发现,浅墨在写代码的时候并没有用namedWindow,遇到想显示出来的Mat变量直接imshow。我们一般是为了规范,才先用namedWindow创建窗口,再imshow出它来,因为我们还有需要用到指定窗口名称的地方,比如用到trackbar的时候。而一般情况想显示一个Mat变量的图片的话,直接imshow就可以啦。

SURF类相关OpenCV源码剖析
OpenCV中关于SURF算法的部分,常常涉及到的是SURF、SurfFeatureDetector、SurfDescriptorExtractor这三个类,我们平常使用的SurfFeatureDetector类和SurfDescriptorExtractor类,其实就是SURF类,他们三者等价。SURF类公共继承自Feature2D类,我们再次进行转到,可以在路径:
d:\Program Files(x86)\opencv\build\include\opencv2\features2d\features2d.hpp看到Feature2D类的声明class CV_EXPORTS_W Feature2D : public FeatureDetector, public DescriptorExtractor。显然,Feature2D类又是公共继承自FeatureDetector以及 DescriptorExtractor类,后两者是surf的2个爷爷。继续刨根问底,我们看看Feature2D的父类FeatureDetector以及 DescriptorExtractor类的定义。
首先是FeatureDetector类:class CV_EXPORTS_W FeatureDetector : public virtual Algorithm  这里,我们看到了我们以后经常会用到的detect( )方法重载的两个原型即FeatureDetector以和 DescriptorExtractor类,原来是SURF类经过两层的继承。FeatureDetector 类和DescriptorExtractor类都虚继承自Algorithm基类。

drawKeypoints函数详解
1.C++: void drawKeypoints(const Mat&image, const vector<KeyPoint>& keypoints, Mat& outImage, constScalar& color=Scalar::all(-1), int flags=DrawMatchesFlags::DEFAULT )  
第一个参数,const Mat&类型的src,输入图像。
第二个参数,const vector<KeyPoint>&类型的keypoints,根据源图像得到的特征点,它是一个输出参数。
第三个参数,Mat&类型的outImage,输出图像,其内容取决于第五个参数标识符falgs。
第四个参数,const Scalar&类型的color,关键点的颜色,有默认值Scalar::all(-1)。
第五个参数,int类型的flags,绘制关键点的特征标识符,有默认值DrawMatchesFlags::DEFAULT。可以在如下这个结构体中选取值。


2016/9/13
1.类就是C++接口,可用于读取视频等操作
2.CUDA是用于GPU计算的开发环境,它是一个全新的软硬件架构,可以将GPU视为一个并行数据计算的设备,对所进行的计算进行分配和管理。CUDA的GPU编程语言基于标准的C语言,因此任何有C语言基础的用户都很容易地开发CUDA的应用程序。英伟达™ 精视™ (NVIDIA GeForce) GPU上,opencv通过CUDA和Opencl加速为Python和Java用户提供接口。
3.全球最大的社交编程及代码托管网站Github作为一个分布式的版本控制系统,在Git中并不存在主库这样的概念,每一份复制出的库都可以独立使用,任何两个库之间的不一致之处都可以进行合并。GitHub 使用 git 分布式版本控制系统,而 git 最初是 Linus Torvalds 为帮助Linux开发而创造的,它针对的是 Linux 平台,因此 git 和 Windows 从来不是最好的朋友,因为它一点也不像 Windows。GitHub 发布了GitHub for Windows,为 Windows 平台开发者提供了一个易于使用的 Git 图形客户端。
4.老版采用c,opencv2和3采用了c++接口。Opencv其实就是 多模块作为代码容器组合起来的一个SDK(Software Development Kit)
5.载入原始图  Mat srcImage = imread("1.jpg");
6.创建与srcImage同类型和大小的矩阵(dstImage):
  dstImage.create( srcImage.size(), srcImage.type() );
6.将原图像转换为灰度图像
  cvtColor( srcImage, grayImage, CV_BGR2GRAY );//OpenCV2写法
  cvtColor( srcImage, grayImage, COLOR_BGR2GRAY );//OpenCV3写法
7.使用 3x3内核来降噪/滤波
  blur( grayImage, edge, Size(3,3) );
8.循环显示每一帧
  while(1)  
    {  
        Mat frame;//定义一个Mat变量,用于存储每一帧的图像
        capture>>frame;  //读取当前帧
        imshow("读取视频",frame);  //显示当前帧
        waitKey(30);  //延时30ms
    }
9.VideoCapture capture(0);和VideoCapture capture(“*.avi”); 分别为从摄像头和现成的视频读入每一帧图像
10.实例:
//*****从笔记本电脑摄像头读取视频抠图进行blur高斯模糊和canny边缘检测处理,并实时显示处理效果

#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
    //从摄像头读入视频
    VideoCapture capture(0);//或者写成:VideoCapture capture;capture.open(0)
    Mat cameraPicture;//这个变量很重要,用于显示

    while (1)
    {
        //读入图像
        Mat frame;//变量用于存储当前帧图像
        capture>>frame;
        cvtColor(frame, cameraPicture, CV_BGR2GRAY);
        //使用3*3模板去噪高斯模糊(3*3+1=7)
        blur(cameraPicture, cameraPicture, Size(7, 7));
        //进行canny边缘检测并输出显示
        Canny(cameraPicture, cameraPicture, 0, 30, 3);
        imshow("处理后的摄像视频", cameraPicture);
        waitKey(30);//延时30毫秒
    }
}



2016/9/16
1.Opencv中的C++类和函数都是定义在命名空间cv之内的,所以一般在开头写:using namespace cv;
2.以彩色模式载入图像,解码后的图像会以BGR的通道顺序存储,而不是通常的RGB的顺序。
3.Mat image1=imread(“1.jpg”,0);//载入灰度图,默认情况下为彩色图像
4.C++有非严格意义上的内存自动管理,2.0用Mat类代替了IplImage,开发算法时,除非万不得已,不进行Mat类对象的复制操作,否则会有大的开销。另外,Opencv设计者让每个Mat对象有自己的信息头,但共享同一个矩阵,通过让矩阵指针指向同一个地址而实现,而拷贝构造函数则只复制信息头和矩阵指针,而不复制矩阵;且赋值运算符和拷贝构造函数只复制信心头。可使用函数clone或者copyTo()来复制一幅图像的矩阵
例如:
Mat A,C;//只创建信息头部分
5.Opencv默认的图片通道存储顺序是BGR即蓝绿红而不是RGB,另外,如Scalar(a,b,c),其中a代表蓝色分量,b代表绿色分量,c代表红色分量。Scalar类的源头是Scalar_类,而Scalar_类是Vec4x的一个变种。
6.类型名的首字母大写,全局int变量用g_n***型,宏名都大写,函数首字母大写或小写。
7.Range(a,b)其实就是Matlab中的a:b,注意这里的a和b都应该为整形。RNG()函数作用为初始化随机数状态的生成器。0代表黑
8.Mat类的公有成员变量cols为把所有通道数当做一列来记
9.outputImage.ptr<uchar>(i);其中ptr是一个模板函数,ptr可以得到第i行的首地址并返回该值。
10.相比用指针直接访问可能出现的越界问题,用迭代器绝对是非常安全的方法。
11.outputImage.at<Vec3b>(j列,i行)[颜色通道号且0代表B即蓝分量]
12.定义ROI区域的两种方法:
Mat imageROI;
imageROI=image(Rect(500,250,logo.cols,logo.rows));
////
Mat imageROI;
imageROI=image(Range(250,250+logo.rows),Range(200,200+logo.cols));
13.计算数组加权和:addWeighted()函数
14.一般的图像处理算子都是一个函数,例如g(x)=h(f(x));其中f(x)是源图像像素,
G(i,j)=a*f(i,j)+b可作为控制图像的亮度和对比度的理论公式,属于点操作算子
15.saturate_cast<char>(data)为溢出保护模板函数。
16.在实际应用中通常采用快速傅里叶变换来高效计算DFT,即使对有限长的离散信号做DFT(时域和频域都是离散的才可以),也应该对其经过周期闫拓成为周期信号再进行变换。即将空间域转换成频域。理论基础是任一函数都可以表示为无数个正弦和余弦函数的和的形式FT就是一个用来将函数分解的工具。傅里叶变换的频域高频部分代表图像细节、纹理信息,低频部分代表了图像的轮廓信息。还可以用来做到图像的增强与图像去噪、图像分割的边缘检测,图像特征提取、图像压缩。


展开阅读全文

没有更多推荐了,返回首页