openCV 学习笔记(自己总结的概括,不够严谨,未整理,见谅)

//Mat新建

Mat src = imread("csdn.png");//读图新建

// 默认构造函数 Mat A;
    Mat ()
    // 常用构造函数 Mat A(10,10,8UC3);
    Mat (int rows, int cols, int type)

    //Mat A(300, 400, CV_8UC3,Scalar(255,255,255));
    Mat (int ndims, const int *sizes, int type, const Scalar &s)

    Mat (Size size, int type)

    Mat (int rows, int cols, int type, const Scalar &s)

    Mat (Size size, int type, const Scalar &s)

    Mat (int ndims, const int *sizes, int type)

    Mat (const Mat &m)

    Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP)

    Mat (Size size, int type, void *data, size_t step=AUTO_STEP)

    Mat (int ndims, const int *sizes, int type, void *data, const size_t *steps=0)

    Mat (const Mat &m, const Range &rowRange, const Range &colRange=Range::all())

    //Mat D (A, Rect(10, 10, 100, 100) );
    Mat (const Mat &m, const Rect &roi)

    Mat (const Mat &m, const Range *ranges)

//图像

imread imread("../libo_resource/test.bmp", CV_LOAD_IMAGE_COLOR);//CV_LOAD_IMAGE_COLOR值为1(默认)3通道, CV_LOAD_IMAGE_GRAYSCALE =0灰度单通道

namedWindow("display window", CV_WINDOW_AUTOSIZE);//CV_WINDOW_AUTOSIZE=1默认,可以全屏,但是图像大小不变,不会插值适应全屏,CV_WINDOW_NORMAL = 0x00000000, 即可以全屏(自动插值)

imshow("display window", img);

imwrite("../libo_output/output.bmp", img);//资源保存在.cpp源文件所在目录的上一级目录的一个文件夹

waitKey(0);//waiting forever

//视频记录

VideoCapture cap(0);

VideoWriter wri;

frameWidth = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_WIDTH)); frameHeight = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_HEIGHT));

frameRate = cap.get(CV_CAP_PROP_FPS);

cap.open(0);//打开ID为0的摄像头文件,打开视频文件为,型如:cap.open("test_02.wmv");

//打开ID为0的摄像头文件,打开视频文件为,型如:cap.open("test_0//打开要写入的视频文件,准备写入!编解码方式参数设置为-1,表示代码运行时会弹出对话框,手动选择编解码方式
    //当读出帧率为0时,可改为wri.open(outFile, -1, 25.0, frameSize, true);25.0对应的形参影响生产的文件的播放速度  
    wri.open(outFile, -1, 10.0, frameSize, true);
    //wri.open(outFile, -1, frameRate, frameSize, true);//true代表彩色输出!

if (!cap.read(frame))//尝试读取下一帧

//释放对象 waitKey(0); cap.release(); wri.release();

/// 转换为灰度图 Mat src_gray; cvtColor(src, src_gray, CV_RGB2GRAY);后面的参数可改

//高斯模糊 GaussianBlur(src, src, Size(3, 3), 0, 0, BORDER_DEFAULT);

//sobel x方向梯度 Sobel(src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT);

//sobel y方向梯度 Sobel(src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT);

//合并 addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, gradImage);

// 调用Canny函数边缘检测  cv::Canny(out, out, 100, 200);

// 对像素进行翻转 cv::threshold(out, out, 128, 255, cv::THRESH_BINARY_INV);

//输入按键 c = waitKey(0); c ==“a” 即可判断输入值

//设定鼠标相应函数 void on_mouse(int event, int x, int y, int flags, void* ustc)   cvSetMouseCallback("src", on_mouse, str);

CV_EVENT_MOUSEMOVE =0, //鼠标移动 其他类似

画线 line(frame, beginPoint, endPoint, Scalar(255, 0, 0), 2);ellipse椭圆,rectaqngle矩形,circle圆,fillPoly多边形

getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1));

参数:

shape:表核的形状,矩形MORPH_RECT;交叉形MORPH_CROSS;椭圆形MORPH_ELLIPSE;

ksize:核尺寸大小;

anchor:锚点的位置,锚点只影响形态学运算结果的偏移;

//图像腐蚀 element = getStructuringElement(MORPH_RECT,Size(15,15)) ; erode(srcImg,dstImg,element)

//图像模糊 blur(srcImg,dstImg,Size(7,7));

SVM的主要思想可以概括为两点:

  1. 它是针对线性可分情况进行分析,对于线性不可分的情况,通过使用非线性映射算法将低维输入空间线性不可分的样本转化为高维特征空间使其线性可分,从而使得高维特征空间采用线性算法对样本的非线性特征进行线性分析成为可能。

  2. 它基于结构风险最小化理论之上在特征空间中构建最优超平面,使得学习器得到全局最优化,并且在整个样本空间的期望以某个概率满足一定上界。

近指针是16位的指针,它只表示段内的偏移地址,因而只能对64k字节数据段内地址进行存取。

远指针是32位指针,它表示段地址:偏移地址远指针可以进行跨段寻址,可以访问整个内存的地址。

巨指针是32位的指针,它其实是规格化的指针,其实它与远指针就差在规格化上面,远指针没有规格化

获取时间getTickCount()返回时钟的周期数,getTickFrequency()一秒周期数

计算运行秒 = (getTickCount(当前值) - getTickCount(初始的值))/getTickFrequency();

ROI(range of Interest)感兴趣区域 = image(Rect(500,250),cols,rows);

加权和函数addWeighted(src1,alpha,src2,alpha2,gamma,dst,dtype) dst = src1*alpha+src2*alpha2+gamma;

可做简单的图像融合,合成

split(src,channels:vector<mat>)通道分离 

merge(channels:vector<mat>,dst)通道融合

傅里叶变换dft(drc,dst,int flags=0,int nonzeroRows=0)

获得一个卷积核返回Mat类型值 getStructuringElement(MORPH_RECT矩形 MORPH_CROSS交叉形 MORPH_ELLIPSE椭圆,尺寸,锚点)

形态学morphologyEx(src,dst,int op, kernel, pointacnchor,int iterations,int bordeType,constScalar& borderValue)

开运算:先腐蚀再膨胀 可消除小物体

闭运算:先膨胀再腐蚀 排除小型黑洞

形态学梯度:是膨胀图与腐蚀图之差 可将团块的边缘突出出来

顶帽或礼帽:原图像与开运算的结果之差 用于分离比邻近点亮一些的斑块

黑帽:闭运算的结果图与原图之差  突出了比原图轮廓周围更暗的区域,分离比邻近点暗的斑块

漫水填充:自动选中了和种子点相连的区域,接着将该区域替换成指定的颜色,用于标记或者分离图像的一部分进行处理或分析

floodFill(src,mask,Point seedPoint,Scalar color,rect ,Scalar loDiff= Scalar(),Scalar upDiff=Scalar(),int flags=4)

高斯金字塔 用来向下采样,先进行高斯内核卷积,在去除偶数行和列,向上采样先扩大,以0填充在高斯卷积

拉普拉斯金字塔 用来从金字塔底层图像重建上层未采样图像,预测残差

pyrUP(src,dst,const Size& dsize=Size(),int borderType=BORDER_DEFAULT)向上采样:图像尺寸加倍

pyrDown向下采样:图像尺寸减半

尺寸调整resize(src,dst,Size dsize,double fx=0,double fy=0,int interpolation =INTER_LINEAR)

阈值Thhreshold(src,dst,double thresh,double maxval,int type)函数对单通道数组应用固定阈值操作,得到二值图像

Sobel算子

Laplacian算子

scharr滤波器

霍夫变换分为,标准,多尺度,累计概率霍夫变换,检测图像中的直线,原理需了解

HoughLines(src,outputArray lines,double rho距离精度,double theta 角度精度,int threshold 累加阈值, double srn =0, double stn = 0);

HoughCircles(sec,outputArray circles, int method,double dp检测圆心的分辨率,double minDist最小圆心间距,double param1前method的参数,double param2, int minRadius, int maxRadius)

重映射:dst(x,y) = src(mapx(x,y),mapy(x,y))  如翻转;mapx,y为映射坐标集

调用函数ramap(src,dst,inputArray map1,inputArray map2,int interpolation插值方式,int borderMode, const Scalar& borderValue)

仿射变换:点乘以变换矩阵

warpAffine(src,dst,InputArray M,size dsize,int flags=INTER_LINEAR,int borderMode=BORDER_CONSTANT,const Scalar& borderValues=Scalar())

getRotationMatrix2D(Point2f center, double angel,double scale)获取旋转缩放的矩阵

直方图均衡化equalizeHist(src,dst)

找到轮廓,存在contours点数组中,hierarchy表示轮廓的拓扑信息(父轮廓,内嵌轮廓等)

findCountours(src,outputArrayofArrays contours,outputArray hierarchy,int mode, int method, Point offset=Point())

绘制轮廓drawContours(src, contours,contourIdx, color,int thickness =1,int lineType=8,inputArray hierarchy= noArray(),int maxLevel =INT_MAX,Point offset= Point())

凸包 :输入点集,寻找点集的凸包,返回hull内,

convexHull(inputArray points, outputArray hull, bool clockwise=fales是否顺时针,bool returnPoints=true是否返回凸包点)

返回外部矩形边界Rect  boundingRect(InputArray points)

寻找最小包围矩形RotateRect minAreaRect(InputArray points)

寻找最小包围圆形 void minEnclosingCircle(InputArray points, Point2f& center,float& radius);

椭圆拟合二维点集 RotateRect fitEllipse(inputArray points)

逼近多边形曲线 void approxPolyDP(intoutArray curve, ouputArray approxCurve,double epsilon, bool closed)

零阶矩表示它的总质量;一阶矩表示它的质心;二阶矩又叫惯性矩,表示图像的大小和方向。

矩的计算:Moment  moments(InputArray array图, bool binary Image =false)

计算轮廓面积:double contourArea(inputArray cotour, bool oriented= false)

计算轮廓长度: arcLength(inputArray curve, bool closed)

分水岭算法:分割图像watershed (src, InputOutputArray markers);

图像修补:inpaint(src, inpainMask, dst,double inpaintRadius, int flags方法)

计算直方图:calcHist(const Mat* images图像组,int nimages图片数量,const int* channels通道数组,inputArray mask掩码,outputArray hist输出二维数组, int dims直方图维度,const int* histSize直方图尺寸数组,const float** ranges每一维数据的取值范围,bool uniform=true是否有标识符,bool accumulate=false累积标识符)

直方图将图像的强度(数值)划分为指定数量的等级,划分的属性是什么直方图calcHist函数并不知道,决定于输入的数据含义是什么。

在数组中寻找最值:minMaxLoc(inputArray src, double* minVal最值指针,double *maxVal=0,Point* minLoc=0二维最值指针,Point* maxLoc=0,inputArray mask=noArray())

比较直方图compareHist(InputArray H1, InputArray H2, int method)或compareHist(const SparseMat& H1,const SparseMat& H2,int method)比较方法CV_COMP_XXX具体自己查

反向投影:首先计算出原图像直方图的分布图像,利用直方图作为概率映射图。对测试图像的每个像素,得到像素值(h,s)在直方图中找到概率数值,记录在最终显示的该像素的位置,表示该像素属于原图像的概率。

calcBackProject(const Mat* images输入图像组,int nimages数量,const int* channels通道索引, InputArray hist输入的直方图, OutputArray backProject输出的反向投影阵列, const float **ranges每一维度的取值范围, double scale =1缩放 ,bool uniform = true是否有标识符);

通道复制:mixChannels(const Mar* src,size_t nsrcs 输入矩阵数, Mat* dst输出数组,size_t ndsts输出矩阵数,const int* fromTo数组索引, size_t npairs索引数量)
模板匹配:模板在图像中上下滑动找到最佳的匹配matchTemplate(inputArray image,InputArray temp1,OutputArray result,int method)方法具体自己查CV_TM_XXX

角点检测:分为几种:一阶导数的局部最大所对应的像素点;2.两条或两条以上边缘的交点;3.图像中梯度值和梯度方向的变化速率都很高的点;4.交点处的一阶导数最大,二阶导数为零,它指示了物体边缘变化不连续的方向;

Harris角点检测:cornerHarris(inputArray src,outputArray dst,int blockSize领域大小, int ksize,double k,int borderType=BORDER_DEFAULT)

Shi-Tomasi角点检测:goodFeaturesToTrack(inputArray image,outputArray corners,int maxCorners,double qualityLevel,double minDistance,InputArray mask = noArray(),int blockSize =3,bool useHarrisDetector = false,double k =0.04)

亚像素角点,精确的角点位置:cornerSubPix(src,size winSize ,size zeroZone termcriteria criteria)

特征检测:特征检测之后得出keyPoint数组,匹配过程针对keypoints

SURF特征点检测:1构建Hessian矩阵构造高斯金字塔尺寸空间,2利用非极大值抑制初步确定特征点3精确定位极值点4选取特诊点的方向5构造surf特征点描述算子

话关键点drawKeyPoints(const Mas&image, const vector<KeyPoint>& keypoints,Mat& outImage,const Scalar& color=Scalar::all(-1), int flags = DrawMatcheesFlags::DEFAULT)

KeyPoint{ point2f pt坐标,float size 特征点领域直径,float angle方向,float response,int octave特征点所在的图像金字塔的组,int class_id 用于聚类的id)

绘制匹配点:drawMatches(const Mat& img1,const vector<Keypoint>& k1,const Mat&img2,const vecotr<keyPoint>& k2,...)

找到最佳匹配:DescriptorMatcher::match(const Mat& queryDescriptors查询描述符集,const Mat& trainDescriptors,训练描述符集,vector<DMatch>& matches得到的匹配,const Mat& mask =Mat())

ORB特征提取:在特征点附近随机选取若干点对,将这些点对的灰度值的大小,组合成一个二进制串,并将这个二进制串作为该特征点的特征描述子。

发布了9 篇原创文章 · 获赞 2 · 访问量 6623

猜你喜欢

转载自blog.csdn.net/kz2313456/article/details/83832653