1. Mat src = imread("1.jpg");
2. imshow("name", mat);
3. imwrite("name" , mat, compression_param);
4. Mat imageROI = image(Rect(800 , 350, logo.cols, logo.rows)); //存储 感兴趣部分
5. addWeighted(imageROI, 0.5, logo, 0.3,0.0, imageROI); //在感兴趣的部分加上图片
6. Scalar(); 四个元素, 可以不写第四个 Scalar(a, b, c); //颜色表示
7. cvtColor(srcImage, dstImage, COLOR_GRAY2BGR); //颜色空间转换
8. colorReduce(srcImage, dstImage , 32); //颜色空间缩减
9. Mat_<Vec3b>::iterator it = outputImage.begin<Vec3b>();
Mat_<Vec3b>::iterator itend = outputImage.end<Vec3b>();
for(; it != itend; ++it){
(*it)[0] = (*it)[0] /div*div + div/2;
(*it)[1] = (*it)[1]/div*div + div/2;
(*it)[2] = (*it)[2]/div*div + div/2;
} //迭代器访问 像素点
10. vector<Mat> channels; splite(srcImage , channels); imageROI = channels.at(0); //通道分离 BGR
11. merge(channels, srcImage4); //通道合并
12. saturate_cast<uchar> 防止溢出。
13. Mat roiA(tempA, Rect(0, 0, A.cols, A.rows));
A.copyTo(roiA); //将 A 拷贝到 tempA 的左上角
14. getOptimalDFTSize(int vecsize); //返回DFT最优尺寸
15. copyMakeBorder(InputArray src, OutputArray dst, int top, int bottom, int left, int right, int borderType, const Scalar & value=Scalar()); //扩充边界
16. magnitude(InputArray x, InputArray y, OutputArray magnitude); //计算二维矢量的幅值
17. log(InputArray src, OutputArray dst); //计算自然对数
18. normalize( matImage , matImage, 0,1, MORM_MINMAX); //归一化, 把幅度搞成 [0 , 1] 在可显示化范围
19. 离散傅立叶变换的意义?
---------------------------------------华丽的分割线------------------------------------------
20. 图像处理,把图像以“图像”的方式处理,而不是作为只由颜色值或灰度值组成的数组。
三种线性滤波:方框滤波、均值滤波、高斯滤波
两种非线性滤波: 中值滤波、双边滤波
7种图像处理形态学:腐蚀、膨胀、开运算、闭运算、形态学梯度、顶帽、黑帽
漫水填充
图像缩放
图像金字塔
阀值化
21. 图像的平滑或滤波目的 : 抽出图像特征和消除图像噪声。
22. 高斯滤波,高斯低通就是模糊、高斯高通就是锐化。
23.方框滤波: void boxFileter(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor =point(-1,-1), boolnormalize=ture, int borderType=BORDER_DEFAULT);
24. 均值滤波:void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1, -1), int borderType = BORDER_DEFAULT); 均值滤波是一种均一化后的方框滤波
25. 高斯滤波:void GaussianBlur(Input Array src, OutputArray dst, Size ksize, double sigmaX, double sigmaY =0,intborderType = BORDER_DEFAULT);
线性滤波, 每个像素的输出是一些输入像素的加权和。
--------------------------------------非线性滤波---------------------------------------------------------
26. 当图中的噪声不是高斯噪声而是偶尔会出现很大的值,用高斯滤波只会使噪声变柔和并不会去除。这时候用中值滤波。
基本思想:用像素点邻域灰度值的中值来代替该像素点的灰度值。 选取点邻域像素值,排序,取中间的值做为该点的输出。、
void medianBlur(ImputArray src, OutputArray dst, int ksize);
27. 双边滤波:好处是可以做边缘保真。不能对高频噪声干净的滤除,只能对低频信息进行较好的滤波。
void bilateralFilter(InputArray src, OutputArray dst , int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT);
28. 形态学:基于形状的一系列图像处理操作。 基于形态学的操作: 膨胀 dilate、腐蚀 erode
膨胀和腐蚀都是对于图像中高亮部分的操作而言的。
29. 膨胀 dilate 就是求局部最大值, 将图像 A部分 与核进行卷积。
void dilate(InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1,-1),int iterations=1,int borderType=BORDER_CONSTANT,const Scalar&borderValue=morphologyDefaultBorderValue());
30. 腐蚀是与膨胀相反的操作, 求局部最小值。
void erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1,int borderType=BORDER_CONSTANT,const Scalar & borderValue=morphologyDefaultVorderValue());
31. 高级形态学滤波: 基于上述两种基础滤波 -> 开运算、 闭运算、 形态学梯度、 顶帽、 黑帽。
32. 开运算: 先腐蚀后膨胀。 dst = open(src,element) = dilate(erode, element); 可以消除小物体,在纤细点处分离物体
33. 闭运算: 先膨胀后腐蚀. dst = close(src, element)= erode(dilate, element); 排除小型黑洞
34. 形态学梯度:膨胀图和腐蚀图之差。 dst = morph-grad(src, element) = dilate(src,element)-erode(src,element);
对于二值图像进行这样的操作可以把团块的边缘突出出来。 用梯度来保留物体的边缘轮廓。
35. 顶帽: 原图像与开运算结果图之差。 dst= tophat(src , element) = src-opn(src,element);
一般用来分离比临近点亮一些的斑块。背景提取
36. 黑帽: 闭运算与原图像之差. dst = blackhat (src,element) = close(src, element) - src;
效果是突出了比原图轮廓周围的区域更暗的区域。 用来分离比邻近点暗一些的斑块
37. void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Pointanchor=Point(-1,-1), int iterations = 1, intborderType = BORDER_CONSTANT,const Scalar & borderValue=morphologyDefaultBorderValue());
op -> MORPH_OPEN 开运算 MORPH_CLOSE 闭运算 MORPH_GRADIENT 形态学梯度 MORPH_TOPHAT 顶帽 MORPH_BLACKHAT 黑帽 MORPH_ERODE 腐蚀 MORPH_DILATE 膨胀
38. 漫水填充:自动选中了和种子点相连的区域,接着将该区域替换成指定的颜色。
版本1:int foodFill(InputOutputArray image, Point seedPoint, Scalar newVal, Rect * rect = 0, Scalar loDiff=Scalar(),Scalar upDiff=Scalar(),int flags=4);
版本2:int floodFill(InputOutputArray image, InputOutuptArray mask, Poitn seedPoint, Scalar newVal, Rect * rect =0,Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags =4);
39. 图像金字塔与图片尺寸缩放:高斯金字塔、拉普拉斯金字塔
高斯是用来向下降采样图像,而拉普拉斯用来从金字塔底部层图像中向上采样,重建一个图像。
拉普拉斯金字塔金字塔 i 层定义: Li = Gi -UP(Gi+1)*g 5x5
void resize(InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR);
一般缩小图像用 CV_INTER_AREA 来插值 , 放大图像用 CV_INTER_CUBIC (效率不高) CV_INTER_LINEAR(效率高 , 为默认值)
//resize 显式指定
Mat dstImge = Mat::zeros(512, 512,CV_8UC3);
Mat srcImage = imread("1.jpg");
resize(srcImage, dstImage, dstImage.size());
//自己算
Mat dstImage;
resize(srcImage, dstImage,Size(0.5,0.5);
40. 阀值化: 直接剔除一些高于或者低于一定值的像素 被视为最简单的图像分割。
double treshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);
自适应阀值操作:adaptiveThreshold()
void adaptiveTreashold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C);
//------------------------ 图像的变换 -----------------------------------------------------------------------------------------
边缘检测、 霍夫变换、重映射、 仿射变换 、直方图均衡化
算子:canny 算子、sobel 算子 、Laplacian 算子、scharr滤波器
41.边缘检测:步骤:滤波、增强、检测
canny 算子:1. 高斯平滑滤波器卷积降噪 2。 计算梯度幅值和方向 3。非极大值抑制 4。滞后阀值
void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3,bool L2gradient=false);
Mat mask = imread("logo.jpg"); //灰度图加载为掩模 logoImage.copyTo(imageROI,mask); //将mask 作为掩码把logo拷贝到区域。
sobel 算子:void Sobel(InputArray src, OutputArray dst,int ddepth, int dx, int dy, ksize=3,double scale=1,double delta =0,int borderType= BORDER_DEFAULT);
Laplacian 算子: void Laplacian(InputArray src, OutputArray dst, int ddepth,int ksize=1,double scale=1,double delta=0,intborderType=BORDER_DEFAULT);
scharr 滤波器:void Scharr(InputArray src , OutputArray dst, int ddepth, int dx,int dy, double scale =1,double delta=0,intborderType=BORDER_DEFAULT);
41. 霍夫变换:HoughCircles
图像处理中的一种特征提取技术。在一个参数空间通过计算累计结果的局部最大值得到一个符合该特定形状的集合做为霍夫变换结果。
运用两个坐标空间的转换将一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状问题转化为统计峰值问题。
霍夫线变换和霍夫圆变换。
霍夫线变换的直接输入必须是边缘二值图像。 标准霍夫变换 ->HoughLines(SHT) 多尺度霍夫变换 ->HoughLines (MSHT) 累计概率霍夫变换 PPHT 效率最高
void HoughLines(InputArray image, OutputArray lines,double rho, double theta, int threshold ,boule srn=0, double stn = 0);
InputArray 为 8 位单通道二进制图像。
累计概率霍夫变换:
void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshokd ,double minLineLength=0, double maxLineGap = 0);
42. 霍夫梯度法:1. 对图像边缘检测 2. 对边缘图像中的每个非零点, 考虑其局部梯度。即用Sobel()计算x和 y方向的Sobel 一阶导数得到梯度。3. 利用得到的梯度,由斜率指定的直线上每一个点都在累加器中被累加。4. 同时标记边缘图像中每一个非0像素的位置。 5. 从二维累加器中这些点还中选择候选的中心,这些中心都大于给定阀值并且大于其说有近邻。6. 接下来对每个中心 ,考虑所有的非0像素。 7. 这些像素按照其与中心距离排序。从最大半径的最小距离算起,选择非0像素最支持的一条半径。8. 如果一个中心收到边缘图像非0像素最充分的支持,并且到前期被选择的中心有做够的距离就会保存下来。
43. 霍夫圆变换: HoughCircles() ;利用霍夫变换算法检测出灰度图中的圆。并且源图像不需要是二值的。
void HoughCircles(InputArray image, OutputArray circles, int method, double dp, double minDist, double param1= 100,double param2=100, int minRadius=0,int maxRadius=0);
-----------------重映射: remap();--------------------
就是把图像中某个位置的像素放置到里一个图像的指定位置的过程。
44. remap(); 根据指定的映射形式,将源图像进行重映射几何变换。 dst (x, y) = src(mapx(x, y) , mapy(x, y));
void remap(ImputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, intborderMode = BORDER_CONSTANT, const Scalar & borderValue=Scalar());
45. 仿射变换:warpAffine getRotationMatrix2D
任意一个仿射变换都可以表示为乘以一个矩阵再加上一个向量(平移) 的形式. 旋转 (rotation) 平移 (translation) 缩放 (scale)
仿射变换:
void warpAffine (InputArray src, OutputArray dst, InputArray M,Size dsize, int flags = INTER_LINEAR, intborderMode = BORDER_CONSTANT, const Scalar &borderValue=Scalar());
二维旋转变换矩阵:
Mat getRotationMatrix2D(Point2fcenter, double angle , double scale);
旋转中心, 旋转角度 , 缩放系数
图片旋转 getRotationMatrix2D 得到旋转矩阵, 然后调用 仿射变换 处理图片.
46. 直方图均衡化:扩大图像的动态范围. 通过拉伸像素强度分布范围来增强图像的对比度。处理灰度图像的重要应用。
void equalizeHist (InputArray src, OutputArray dst);
8 位但通道图像
--------------------------------------------------------------------------------------------------------------------------------
边缘检测的 canny 算子, sobel 算子 , Laplace 算子 scharr 滤波器 图像特征提取: 霍夫线变换,霍夫圆变换 。 重映射,仿射变换,直方图均衡化
-------------------------------------------------------------------------------------------------------------------------------------
图像轮廓与图像分割修复: 把边缘检测算法检测的轮廓像素组装为一个整体, 图像处理的分水岭算法和图像修补
47. findContours();
void findContours(InputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode , int method, Point offset=Point());
输入为 8 位单通道图像。图像非0为1 , 0 为 0。图像为二进制。 使用 compare() inrange() threshold() adaptivethreshold() canny() 等从灰度图或彩色图转为二进制图。
mode 轮廓检索模式: RETR_EXTERNAL 指检测最外层轮廓 RETR_LIST 提取所有轮廓 轮廓间没有等级关系 RETR_CCOMP 提取所有轮廓 组织成双层结构 RETR_TREE 提取所有轮廓 重新建立网状轮廓结构
method 轮廓近似方法: CHAIN_APPROX_NONE 获取每个轮廓每个像素 CHAIN_APPROX_SIMPLE 压缩水平方向 垂直方向 对角线方向 的元素。 只保留该方向的终点像素 即 矩形只保留4个点 CHAIN_APPROX_TC89_L1 , CHAIN_APPROX_TC98_KCOS 使用 Teh-Chinl 链逼近算法中的一个
drawContours 绘制外部和内部轮廓
void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar & color , int thickness = 1, int lineType = 8, InputArray hierarchy = noArray(), int maxLevel = INT_MAX, Point offset = Point());
48. 寻找凸包:将最外层的点连接起来构成一个凸多边形,它包含点集中的所有点。然后计算其凸缺陷。
void convexHull (InputArray points, OutputArray hull, bool clockwise= false, bool returnPoints=ture);
49. 轮廓-多边形
Rect boundingRect(InputArray points); 指定点集最外面的矩形边界
RotateRect minAreaRect(InputArray points); 寻找可旋转最小面积的包围矩形
void minEnclosingCircle(InputArray points, Point2f & center , float & radius); 运用迭代给定 2D点集 寻找面积最小的可包围他们的圆形。 二为输出圆心, 三为输出半径
RotateRect fitEllipse(InputArray points); 用椭圆拟合二维点集
void approxPolyDP(InputArray curve, OutputArray approxCurve,double epsilon, bool closed); 逼近对边形曲线
50. 图像的矩:
moments 计算图像所有的矩
contourArea 计算轮廓面积
arcLength 计算轮廓或曲线长度
Moments moments(InputAray array, bool binaryImage=false);
double contourArea(InputArray controur, bool oriented= false);
oriented 为true时,返回带符号的面积值正负取决于轮廓的方向。
double arcLength(InputArray curve, bool closed);
51. 分水岭算法:将图像边缘转化为山脉,均匀区域转化为山谷。
void watershed(InputArray srcImage, InputOutputArray markers);
52. 图像的修补:清除灰尘和划痕
void inpaint(InputArray src, InputArray inpainMask, OutputArray dst, double inpaintRadius, int flags);
//------轮廓查找并绘制、凸包检测、寻找并绘制物体凸包、创建包围轮廓的矩形和圆形边界、使用多边形包围轮廓、图像轮廓矩、分水岭算法、图像修补-------------------------
----------------------------------------------------- 直方图与匹配----------------------------------------------------------------------
53.计算直方图:
void 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);
channels 需要计算的通道
hist 输出的二维数组
dims 需要计算的纬度
histSize 这个是 直方图的x轴,表示每个取值区间 255 的值, 选择255 就是一个值为一个区间,取100 就是 255/100 取整为一个区间
ranges 每个计算的取值范围。
找寻 最值:minMaxLoc()
void minMaxLoc(InputArray src, double * minVal, double * maxVal = 0, Point * minLoc = 0, Point * maxLoc = 0, InputArray mask= noArray());
返回最大最小值的指针, 最大最小值位置的指针。
54.直方图对比:
double compareHist(InputArray H1, InputArray H2, int method);
55. 反向投影:作用:用于在输入图像中查找与特定图像最匹配的点或者区域。
反向投影的结果包含了以每个输入图像像素点的直方图的对比结果。可以把它看作是一个二维的浮点型数组,二维矩阵,或者但通道的浮点图像。
void calcBackProject(const Mat* images, int nimages, const int * channels, InputArray hist, OutputArray backProject, const float ** ranges, double scale = 1,bool uniform=true);
nimage: 输入了多少个图像。
channels : 需要统计的通道dim索引。
hist: 输入的直方图
backProject 目标反投影阵列 须为单通道并和image[0] 有相同的大小和深度。
ranges: 每一个维度数组的取值范围。
通道复制: mixChannels 由输入参数复制某通道到输出参数特定的通道中。
void mixChannels(const Mat *src, size_t nsrcs, Mat * dst, size_t ndsts, const int * fromTo, size_t npairs);
src: 输入的数组
nsrcs : src 的输入矩阵数
dst : 输出的数组 , 所有矩阵必须被初始化,且大小和深度必须和src[0] 相同
ndsts: dst 输入的矩阵数
formTo: 对指定的通道进行复制的数组索引
npairs : fromTo 的索引数
void mixChannels(const vector<Mat>&src, vector <Mat> &dst, const int * fromTo, size_t npairs);
//下面的程序把一个rgba图像转化为3通道的BGR (R通道和B通道交换)和一个单独的alpha单通道图像。
Mat rgba(100, 100 , CV_8UC4, Scalar(1,2,3,4));
Mat bgr(rgba.rows, rgba.cols, CV_8UC3);
Mat alpha(rgba.rows, rgba.cols, CV_8UC1);
Mat out[] = {bgr, alpha};
//将 rgba[0] -> bgr[2] rgba[1]->bgr[1] rgba[2]->bgr[0] rgba[3]->alpha[0];
int form_to[]={0,2, 1,1, 2,0, 3,3}
mixChannels(&rgba, 1, out, 2, from_to, 4);
//
56. 图像的深度为用于表示像素点所用的位数。
Mat dstImage.create(srcImage.size(), srcImage.depth());
57. 模板匹配:不是基于直方图,而是通过在输入图像上滑动图像块,对实际的图像块和输入图像进行匹配的一种匹配方式。
void matchTemplate(InputArray image, InputArray templ, OutputArray result, int method);
image: 待搜索图像。
templ: 搜索模板.
result: 比较结果的映射图像,其必须为单通道 32位浮点型图像。如果图像尺寸为WxH templ 为 wxh, result 为 (W-w +1)× (H-h +1)
------------------ calcHist 计算直方图 minMaxLoc 在数组中找到全局最小和最大值并定位 compareHist 两直方图比较 calcBackProject 计算直方图的反射投影 mixChannels 由输入参数复制某通道到输出参数特定的通道中 matchTemplate 匹配和模板重叠的地方-------------------------
58. 角点检测: 一阶导数(即灰度的梯度)的局部最大所对应的像素点 两条及两条以上边缘的交点 图像中梯度值和梯度方向变化速率都很大的点 角点处一阶导数最大二阶导数为零 指示了物体边缘变化不连续的方向
59.harris 角点检测:
void cornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k, ntborderType= BORDER_DEFAULT);
Shi-Tomasi 角点检测:
void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask= noArray(),int blockSize=3,bool useHarrisDetector= false, bool useHarrisDetector = false, double k = 0.04);
maxCorners 角点最大数量
qualityLevel 角点检测可接受的最小特征值
minDistance 角点之间的最小距离
60. 亚像素点检测:
void cornerSubPix(InputArray image, InputOutputArray corners, Size winSize, Size zeroZone, TermCriteria criteria);
------------------------- cornerHarris 运行Harris角点检测算子进行角点检测 goodFeaturesToTrack Shi-Tomasi 算子确定图像的强角点 cornerSubPix 寻找亚像素角点位置---------------------
------------------------------------------------------------ 特征检测与匹配----------------------------------------------------------
------ surf 算法 --------
61. surf 算法 : 1. 构建Hessian 矩阵构造高斯金字塔尺度空间 2. 利用非极大值抑制初步确定特征点 3. 构造surf 特征点描述算子
62. 绘制关键点: drawKeypoints()
viod drawKeypoints(const Mat & image, const vector<KeyPoint> &keypoints, Mat& outImage, const Scalar& color,= Scalar::all(-1), int flags= DrawMatchesFlags::EDFAULT);
keypoints : 根据源图像得到的特征点, 这个是个输出参数。
outImage: 输出图像, 其内容取决于第五个参数。
flags : DEFAULT = 0 //创建输出图像矩阵。 使用现存的输出图像绘制匹配对和特征点,且对每一个关键点只绘制中间点。
DRAW_OVER_OUTIMG = 1 //不创建输出图像矩阵,而是在输出图像上绘制匹配对。
NOT_DRAW_SINGLE_POINTS = 2 //单点特征点不被绘制
DRAW_RICH_KEYPOINTS = 4 // 对每一个关键点,绘制带大小和方向的关键点圆圈。
63. keyPoint 类: class keyPoint{
Point2f pt; //坐标
flaot size ; // 特征点的领域直径
float angle ; // 特征点的方向, 值为 0-360 负值表示不使用
float response; //
int octave; //特征点所在图像金字塔的组
int class_id; // 用于聚类的id
};
64. SURF 特征提取:
3.0中 Ptr<SURF> surf = SURF::create(minHessian);
1.使用surf->detect(srcImage, keyPoints) 接口来寻找关键点
2.surf->compute(srcImage,keyPoints, descriptors);寻找关键点对应的特征向量,完成特定计算
3. 匹配:Ptr<DescriptorMatcher> matcher; vector<DMatch>matches; matcher->match(descriptors1 , descirptors2, matches);
4.绘制: drawMatchers 绘制检测到的匹配点 drawMatches(srcImage, keyPoint1, srcImage2, keyPoints2, matches, imgMatches);
65. 使用FLANN 进行特征点匹配:快速最近邻逼近搜索函数库。
void DescriptorMatcher::match(const Mat & queryDescriptors, const Mat & trainDescriptors, vector<DMatch> & matches, const Mat&mask= Mat());
queryDescriptors //查询描述符集
trainDescriptors //训练描述符集
matches //得到的匹配
66. 寻找已知物体:
findHomography 寻找匹配上的关键点的变换
perspectiveTransform 映射点
寻找透视变换:
Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method = 0, double ransacReprojThreshold = 3, OutputArray mask=noArray());
srcPoints: 源平面上对应点
dstPoints: 目标平面对应的点
method : 计算单应矩阵的方法
进行透视矩阵变换: perspectiveTransform();
void perspectiveTransform(InputArray src, OutputArray dst , InputArray m);
src : 输入图像
dst: 输入图像
m : 变换矩阵
67. ORB 特征提取: ORiented Brief 江湖流传 ORB 综合性能相较于其他特征提取都是最好的。
Brief 描述子:思路是在特征点附近随机选取若干点对,将这些点对的灰度值的大小,组成一个二进制串,并将二进制串做为该特征点的特征描述子。
Brief 优点: 快 缺点:不具备旋转不变性、对噪声敏感、不具备尺度不变性
ORB 算法就是试图解决上述缺点 1 和 2。
采用摄像头获取待检测图像,使用 FLANN-LSH 进行匹配。
//------------------SURF 特征点检测 SURF 特征提取 FLANN进行特征匹配 FLANN结合SURF进行关键点描述和匹配 SIFT 配合暴力匹配进行关键点描述和提取 寻找已知物体 利用ORB算法进行关键点描述和匹配-----------------------------------------------------