/********************************************************************************************
*opencv3.2 c++版学习常用函数总结,后续学习中不断添加新函数。
*********************************************************************************************/
1、图像读写函数
Mat imread(const String& filename,int flags = IMREAD_COLOR);
filename:图片的路径
flags:
- flags>0,三通道彩色图
- flags=0,灰度图
- flags<0,包含Alpha通道的图像
Mat img1 = imread("1.jpg",2|4) //加载无损图像
Mat img2 = imread("1.jpg",0) //载入灰度图
Mat img3 = imread("1.jpg",199) //载入三通道彩色图
image:输入图像矩阵
params –
Format-specific save parameters encoded as pairs paramId_1, paramValue_1, paramId_2, paramValue_2, ... . The following parameters are currently supported:
- For JPEG, it can be a quality ( CV_IMWRITE_JPEG_QUALITY ) from 0 to 100 (the higher is the better). Default value is 95. 对于JPEG,图像质量。
- For PNG, it can be the compression level ( CV_IMWRITE_PNG_COMPRESSION ) from 0 to 9. A higher value means a smaller size and longer compression time. Default value is 3. 对于PNG,压缩等级。
- For PPM, PGM, or PBM, it can be a binary format flag ( CV_IMWRITE_PXM_BINARY ), 0 or 1. Default value is 1.
void imshow(const string& winname, InputArray image)
winname:窗口名字
image:要显示的图像矩阵
2、获得旋转矩阵的函数
Mat getRotationMatrix2D(Point center,double angle,double scale)
主要是获取图像以center为中心、angle的角度、scale缩放比例的旋转矩阵
center:旋转中心
angle:旋转角度
scale:缩放因子
3、仿射变换函数
warpAffine(src,dst,warp_mat,dst_size)
src:输入图像
dst:输出图像
warp_mat:仿射矩阵
dst_size:输出图像大小
4、求仿射矩阵函数
Mat getAffineTransform(srcTri,dstTri)
通过三点的映射几何关系获得仿射矩阵。。。。
srcTri:输入的三点矩阵
dstTri:输出的三点矩阵
5、图像混合函数
addWeighted(inputArray img1,double alpha,inputArray img2,double beta,double gamma,OutputArray dst,int dtype=-1)
运算公式:dst = alpha*img1 + beta*img2 +gamma
img1:需要混合的图像矩阵
alpha:img1图像所占的比例
img2:需要混合的图像矩阵
beta:img2图像所占的比例(一般为1-alpha)
gamma:偏移量
dst:img1和img2按照比例混合后的输出图像
dtype:输出矩阵的深度,默认-1
6、图像大小变换函数
resize(inputArray src,OputArray dst,Size dsize,double fx=0,double fy=0,int interpolation=INTER_LINEAR)
例:resize(img1,img2,Size(800,480))
src:原图像阵列
dst:输出图像阵列
dsize:输出图像的大小
fx,fy:分别是沿着x、y轴的缩放系数
interpolation :
INTER_NEAREST - 最近邻插值
INTER_LINEAR - 线性插值(默认)
INTER_AREA - 区域插值
INTER_CUBIC - 三次样条插值
INTER_LANCZOS4 - Lanczos插值
7、数值取整函数
cvRound(num) 返回跟参数最接近的整数值
cvFloor 返回不大于参数的最大整数值
cvCeil 返回不小于参数的最小整数值
8、绘制直方图函数
CV_EXPORTS void calcHist( const Mat* images, int nimages,
const int* channels, InputArray mask,SparseMat& hist, int dims,
const int* histSize, const float** ranges,
bool uniform=true, bool accumulate=false );
例:Histogram::Histogram()
{
histSize[0] = 256;
histSize[1] = 256;
histSize[2] = 256;
hranges[0] = 0.0;
hranges[1] = 256.0;
ranges[0] = hranges;
ranges[1] = hranges;
ranges[2] = hranges;
channels[0] = 0;
channels[1] = 1;
channels[2] = 2;
}
cv::Mat Histogram::getHistogram(const cv::Mat &image)
{
cv::Mat hist;
cv::calcHist(&image,1,channels,cv::Mat(),3,histSize,ranges);
return hist;
}
image:原图像阵列
nimages:图像个数
channels:图像信道
mask:可选的掩码,如果不为空,则必须是8-bit数组,而且大小和原图像相同,非零位置为要计算的直方 图区域
hist:输出直方图阵列
dims:处理直方图的维数
histSize:每一维直方图的尺寸大小
ranges:直方图每一维数据的大小范围
9、绘画矩阵的函数
(1)、利用对角线来绘制矩形
void rectangle(Mat& img, Point pt1,Point pt2,const Scalar& color, int thickness=1, int lineType=8, int shift=0)
例:cv::rectangle(matImage,cvPoint(88,88),cvPoint(168,168),Scalar(0,255,0),1,1,0);
(2)、通过举行参数来绘制矩形
void rectangle(Mat& img, Rect rec, const Scalar& color, int thickness=1, int lineType=8, int shift=0 )
例: Rect rec1 = Rect(100, 300, 600, 200);
rectangle (image3, rec2, Scalar(0, 0, 255), -1, 8, 0);
img:图像阵列
pt1:矩形的左上角点
pt2:矩形的右下角点
color:绘制矩形框的颜色
thickness:组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形。
lineType:线条的类型
shift:坐标点的小数点位数
10、图像腐蚀和膨胀
(1、获取指定形状和尺寸的结构元素函数
Mat element = getStructuringElement(MORPH_RECT,
Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1),
Point( g_nStructElementSize, g_nStructElementSize ) );
参数一:形状选择
矩形:MORPH_RECT;
交叉形:MORPH_CORSS;椭圆形:MORPH_ELLIPSE;
参数二:内核尺寸
参数三:描点的位置,默认(-1,-1)表示中心点
(2、图像腐蚀
void erode( InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor=Point(-1,-1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue() );
参数一:原图像
参数二:目标图像(输出)
参数三:腐蚀操作的内核,默认位于中心的3*3大小的核
参数四:默认(-1,-1)表示位于element的中心,一般不用管它
参数五:迭代使用erode函数的次数,默认值为1
参数六:边界模式选择
参数七:当边界值为常数时,有默认值morphologyDefaultBorderValue()
(3、图像膨胀
void dilate(InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor=Point(-1,-1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue() )
参数描述同上
例:Mat src = getStructuringElement(MORPH_RECT,Size(15,15));
Mat out,out1;
dilate(src,out,element);
erode(src,out1,element);
imshow("dilate",out);
imshow("erode",out1);
11、滑动条回调函数
创建进度条:
CV_EXPORTS int createTrackbar(const string& trackbarname, const string& winname,
int* value, int count,
TrackbarCallback onChange = 0,
void* userdata = 0);
参数一:进度条名字
参数二:窗口名
参数三:进度条初始化阈值
参数四:进度条最大刻度值
参数五:回调函数,形式void callback(int,void *)
获取当前进度条的位置:
int getTrackbarPos(const string& trackbarname, const string& winname)
参数一:轨迹条的名字
参数二:轨迹条的父窗口名
12、鼠标操作回调函数
void setMouseCallback(conststring &winname,MouseCallback onMouse,void *userdata=0)
参数一:窗口名字
参数二:回调函数原型void Foo(int event,int x,int y,int flags,void *param)
参数三:用户定义传递到回调函数的数值
13、滤波操作函数详解
线性滤波器
(1、均值滤波,是归一化后的方框滤波器
void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
参数一:原图像阵列
参数二:输出图像阵列
参数三:内核大小
参数四:锚点(即需要滤波的点),默认为(-1,-1)中点
参数五:int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。
(2、高斯滤波
GaussianBlur( InputArray _src, OutputArray _dst, Size ksize,
double sigma1, double sigma2,
int borderType )
参数一:输入图像阵列
参数二:输出图像阵列
参数三:核的大小
参数四:x方向正态分布参数
参数五:y方向正态分布参数
参数六:边界类型,默认就好
(3、方框滤波器
void boxFilter(InputArray src,OutputArray dst,int ddepth,Size ksize,Point auchor=Point(-1,-1),boolnormalize=true,int borderType = BORDER_DEFAULT)
参数一、二:输入输出阵列
参数三:输出图像的深度,-1表示原图的深度
参数四:内核的大小
参数五:锚点(即被平滑的那个点),Point(-1,-1)表示内核中心
参数六:表示内核是否被其区域归一化,当为true时为均值滤波
参数七:边界类型选择
非线性滤波器
(1、中值滤波
medianBlur(InputArray src,OutputArray dst,int size)
参数一:输入图像阵列
参数二:输出图像阵列
参数三:正方形区域的边长
(2、双边滤波
bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace,
int borderType=BORDER_DEFAULT );
参数三:滤波时像素领域的直径,如果为-1则由后面的sigmaspace计算
参数四:计算图像的颜色偏移量
参数五:计算图像的空间偏移量
参数六:边界框
14、几种边缘检测算法
(1、sobel算子
void Sobel( InputArray src, OutputArray dst, int ddepth,
int dx, int dy, int ksize = 3,double scale = 1, double delta = 0,
int borderType = BORDER_DEFAULT );
参数三:输出图像的深度
参数四、五:x、y方向的导数阶数
参数六:内核大小
最后三个参数:分别是缩放因子、增量、边界模式
(2、canny算子
Canny (
InputArray image, // 输入图像 (8位)
OutputArray edges, // 输出图像 (单通道,8位)
double threshold1, // 下阈值
double threshold2, // 上阈值
int apertureSize = 3,
bool L2gradient = false //采用近似,若为true采用更精确
)
(3、Laplace算子
Laplacian (
InputArray src, //输入图像
OutputArray dst, //输出图像
int ddepth, //输出图像深度
int ksize = 1, //内核大小
double scale = 1, //缩放因子
double delta = 0, //增量
int borderType = BORDER_DEFAULT //边界模式
)
15、程序运行时间的计算
double time0 = static_cast<double>getTickCount();
.................
time0 = (static_cast<double>getTickCount()-time0)/getTickFrequency();
cout<<"the duration time is:"<<time0<<endl;
16、通道分离和合并
C++: void split(const Mat& src, Mat*mvbegin);
C++: void split(InputArray m,OutputArrayOfArrays mv);
参数一:InputArray 类型的m,或者 Mat & 型的src
参数二:OutputArrayOfArrays 类型的mv,或者vector容器
示例:
bool Split_channels()
{
Mat img = imread("BruceLi.jpg");
if(img.empty())
{
cout<<"read BruceLi.jpg fail"<<endl;
return false;
}
vector<Mat> channels;
split(img,channels);
imshow("B",channels[0]);
imshow("G",channels[1]);
imshow("R",channels[2]);
return true;
}
C++: void merge(const Mat* mv, size_tcount, OutputArray dst)
C++: void merge(InputArrayOfArrays mv,OutputArray dst)
参数一:输入矩阵 或者vector容器阵列
参数二:当mv输入一个空白的数组时,count代表输入矩阵的个数
参数三:输出矩阵
示例:
bool Split_channels()
{
Mat img = imread("BruceLi.jpg");
if(img.empty())
{
cout<<"read BruceLi.jpg fail"<<endl;
return false;
}
vector<Mat> channels;
split(img,channels);
imshow("B",channels[0]);
imshow("G",channels[1]);
imshow("R",channels[2]);
Mat image(img.size(),CV_8UC3);
merge(channels,image);
imshow("image",image);
return true;
}
17、图像形态学处理函数
void morphologyEx(InputArray src,OutputArray dst,int op,InputArray kernel,
Point auchor = Point(-1,-1),intiterations = 1,int borderType = BORDER_CONSTANT,
const Scalar &borderValue = morphologyDefaultBorderValue());
参数一、二:分别是输入输出阵列
参数三:形态学运算的类型:MORPH_OPEN(开运算)、MORPH_CLOSE(闭运算)、MORPH_GRADIENT(形态学梯度)
MORPH_TOPHAT(顶帽)、MORPH_BLACKHAT(黑帽)、MORPH_ERODE(腐蚀)、MORPH_DILATE(膨胀)
参数四:内核大小,若为NULL则默认3*3,一般通过函数getStructuringElement获取内核
参数五:锚的位置,(-1,-1)默认中心点
参数六:迭代使用函数的次数,默认1
参数七:边界类型,有默认值
参数八:有默认值一般不需要管
实例:
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc,char *argv[])
{
Mat g_srcImage = imread(argv[1]);
if(g_srcImage.empty())
{
cout<<"打开图像失败"<<endl;
return -1;
}
namedWindow("原图");
namedWindow("效果图");
imshow("原图",g_srcImage);
Mat element = getStructuringElement(MORPH_RECT,Size(15,15));
morphologyEx(g_srcImage,g_srcImage,MORPH_OPEN,element);
imshow("效果图",g_srcImage);
waitKey(0);
return 0;
}
18、图像金字塔
1、向上取样:
void pyrUp(InputArray src,OutputArray dst,const Size& dstsize = Size(),int borderType =BORDER_DEFAULT )
参数一、二:输入输出阵列
参数三:输出图像打小
参数四:边界类型,一般不用管
2、向下采样
void pyrDown(InputArray src,OutputArray dst,const Size& dstsize = Size(),int borderType =BORDER_DEFAULT )
19、图像阈值化操作
double threshold(InputArray src,OutputArray dst,double thresh,double maxval,int type)
参数一、二:输入输出图像阵列
参数三:阈值
参数四:当第五个参数取0或1时的最大值
参数五:阈值类型CV_THRESH_BINARY,CV_THRESH_BINARY_INV,_TRUNC,_TOZERO,_TOZERO_INV(0,1, 2,3,4)
20、霍夫变换
1)、标准霍夫变换
void HoughLines(InputArray src,OutputArray lines,double rho,double theta,int threshold,double srn=0,double stn=0)
参数一:八位单通道二进制图像
参数二:每一条线有(p,θ)表示,p是离原点的距离,θ是线的旋转角度
参数三:直线搜索时的进步尺寸的单位半径
参数四:直线搜索时的进步尺寸的单位角度
参数五:累加平面的阈值参数,大于阈值才可以被检测并返回结果
参数六:粗略的累加器进步尺寸直接是参数三rho,精确的是rho/srn
参数七:theta/stn
2)、累计概率霍夫变换
void HoughLinesP(InputArray src,OutputArray lines,double rho,double theta,int threshold,double minLineLength=0,double maxLineGap=0)
参数一、三、四、五:和上一样
参数二:每条直线由四个元素组成(x_1,y_1) (x_2,y_2),表示线段的结束点
参数六:表示最低线段长度,比这个设定参数短的线段就不能被显现出来
参数七:允许将同一行点与点之间连接起来的最大距离
3)、霍夫圆变换
void HoughCircles(InputArray src,OutputArray circles,int method,int dp,double mindist,double param1=100,double param2=100,int minRadius=0,int maxRadius=0)
参数一:八位灰度单通道图像
参数二:输出矢量(x,y,radius)原点坐标和半径
参数三:检测方法,HOUGH_GRADIENT霍夫梯度法
参数四:检测圆心的累加器图像分辨率是输入图像的1/dp倍
参数五:算法能明显区分两个圆之间的最小距离,指圆心距离,过大时有些圆不能检测,过小时多圆重合。
参数六:表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半
参数七:表示检测阶段圆心的累加器阈值,越小越可以检测根本不存的圆,越大就检测出更加完美的圆
参数八:圆半径最小值
参数九:圆半径最大值