基本opencv2处理方法
来源:互联网 发布:python统计字符串个数 编辑:程序博客网 时间:2024/05/16 14:20
opencv1.0版本于2006年面世,主要基于C语言。2009年发布opencv2,主要基于C++。我主要学习了2.0版本。其实两者之间的函数调用还是有些相同的,只不过有的时候使用的是全局函数cv***,而2.0使用的是不带cv的函数。
此时opencv库被划分为多个模块,这些模块被编译成库文件后,位于lib文件夹中,这是我截取的全部模块,我们需要的就是引用这些模块。
Opencv_core模块:包含核心功能,尤其是低层数据结构和算法函数。
Opencv_improc模块:包含图像处理函数
Opencv_highgui模块:包含读写图像及视频的函数,以及操作图形用户界面函数。
opencv_features2d模块:包含兴趣点检测子,描述子以及兴趣点匹配框架
Opencv_video模块:包含运动估算,特征特征以及前景提取函数与类
Opencv_objdetect模块:包括物体检测函数,如脸部和行人检测。
库文件中还包含其他的工具模块,如机器学习(opencv_ml),计算几何(opencv_flann),第三方代码(opencv_contrib)等。
#include “cv.h”这是旧的代码方式,那是库还没有被划分为模块。
opencv2的库文件声明如下:
#include
#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>using namespace std;using namespace cv;int _tmain(int argc, _TCHAR* argv[]){ Mat image = imread("1.jpg",1); if (!image.data) { //没有这个图像文件 } cout<<image.size().height<<","<<image.size().width; namedWindow("show"); imshow("show",image); waitKey(0); //这个必须用,否则界面会卡死 getchar(); return 0;}
image.data是指向已分配的内存块的指针,当图片没有加载进来,则为 NULL。
image.size()返回的是一个结构体,实际上包括width和height两个成员变量。
图像的浅拷贝和深拷贝:
(1)浅拷贝
Mat B;
B = image;
Mat C(iamge);
这两种方式都被称为浅copy,他们有不同的矩阵头,但是他们共享内存空间,即指向同一个图像矩阵。当图像矩阵发生变化时,两者相关联,都会变化。
(2)深拷贝
Mat B,C;
B = image.clone();
image.copyTo(C);
IplImage转化为Mat:
我们常常算法会需要IplImage类型,而不是Mat类型。这两者之间的转换也非常常见。
IplImage* pImage = cvLoadImage("1.jpg",1);pImage =&IplImage(result);Mat result(pImage,false);//后面一个参数的意思是。是否提供深拷贝。默认情况是false,true为深拷贝
简单存取像素值:
void salt(Mat &image,int n){ for (int k=0;k<n;k++) { int i = rand()%image.cols; int j = rand()%image.rows; if (image.channels()==1) { image.at<uchar>(j,i) = 255; } else if (image.channels()==3) { image.at<Vec3b>(j,i)[0] = 255; image.at<Vec3b>(j,i)[1] = 255; image.at<Vec3b>(j,i)[2] = 255; } }}//Main函数中//简单存取像素值 写入像素值Mat imageSource = imread("1.jpg",1);salt(imageSource,3000);namedWindow("SaltImage");imshow("SaltImage",imageSource);
注意: image.at< vec3b >(j,i)[0] = 255。成员函数at(x,y)可以用来存取图像元素,但是他是模板函数,你需要指定操作成员的类型 at< uchar >(y,x)。
vec3b是由3个uchar组成的,可以通过操作符[]来获取。
通过指针遍历图像:
int nRows = imageSource.rows;int nCols = imageSource.cols*imageSource.channels();for (int j=0;j<nRows;j++) { uchar* data = imageSource.ptr(j); for (int i=0;i<nCols;i++) { data[i] = data[i]/2; } }
通过迭代器遍历图像:
//通过迭代器访问图像 Mat imageIterator = imread("1.jpg",1); Mat_<Vec3b>::iterator begin = imageIterator.begin<Vec3b>(); Mat_<Vec3b>::iterator end = imageIterator.end<Vec3b>(); for (;begin!=end;begin++) { (*begin)[0] = (*begin)[0]/2; (*begin)[1] = (*begin)[1]/2; (*begin)[2] = (*begin)[2]/2; } namedWindow("IteratorImage"); imshow("IteratorImage",imageIterator);
附:如何来计算一个函数运行的时间:
函数开始处:
double time = static_cast< double >(getTickCount());
time = (static_cast< double >(getTickCount())- time)/getTickFrequency(); //单位秒
- 基本opencv2处理方法
- 基本opencv2处理方法(二)
- 基本opencv2处理方法(三)-基本滤波器
- 图像基本处理方法
- openCV2基本操作1
- openCV2基本操作2
- Matlab 图像处理基本方法
- php异常处理基本方法
- php表单处理基本方法
- opencv2.x配置方法
- opencv2.3图像基本操作
- opencv2 像素的基本操作
- OpenCV2 轮廓处理 多边形逼近
- python2+opencv2做图像处理
- opencv2-第五章-图像处理
- ios报异常处理基本方法
- MFC 处理 HTTP 请求的基本方法
- PHP算法和基本处理方法
- BZOJ 1036 [ZJOI2008] 数的统计 树链剖分
- storm 1.0新功能-Tuple Sampling and Debugging 数据采集
- 面向对象
- dp 最佳加法表达式
- 2016.07.18【初中部 NOIP普及组 】模拟赛题解
- 基本opencv2处理方法
- IOS-内存管理
- UVA - 11044 Searching for Nessy
- POJ2109 高精度(含大数开方)+二分
- LLVM与Clang的概述及关系
- 揭示java序列化算法
- UVA - 10719 Quotient Polynomial
- 字串
- UVA - 10970 Big Chocolate