# opencv-learning **Repository Path**: xiaowei0312/opencv-learning ## Basic Information - **Project Name**: opencv-learning - **Description**: No description available - **Primary Language**: Unknown - **License**: Zlib - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-01-12 - **Last Updated**: 2025-02-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README pip install opencv-python pip install numpy pip install matplotlib pip install opencv-contrib-python # 颜色空间 RGB:人眼的色彩空间 BGR:Opencv默认使用BGR HSV / HSB / HSL:绘图 YUV:视频 ## RGB / BGR ## HSV / HSB / HSL Hue:色相,即色彩,如红色,蓝色 Saturation:饱和度,颜色的纯度 Value:明度 ## YUV YUV4:2:0 YUV4:2:2 YUV4:4:4 # 形态学 腐蚀:将二值化后的白色变瘦,注意:腐蚀的是白色区域。 腐蚀(erode):卷积的时候,周围全是1,中心点变成1,可以把黑色中一些小的白色抹掉 膨胀(dilate):卷积的时候,中心点是1,周围全变成1,可以把白色中一些小的黑色抹掉 开运算:先腐蚀,后膨胀 闭运算:先膨胀,后腐蚀 梯度(gradient):原图 - 腐蚀 = 边缘 顶帽(tophat):原图 - 开运算 = 大图形外的小图形 = 黑色区域的白色噪点 黑帽(blackhat):闭运算 - 原图 = 大图形内的小图形 = 白色区域的黑色噪点 边缘检测: 高通滤波:canny 梯度:kernel密切相关 # 图像轮廓 图像轮廓:具有相同颜色或强度的连续点的曲线,不一定是个闭合的空间(正方形、圆),一条直线他也是有轮廓的 颜色,相同颜色 灰度:相同强度 作用: 可以用于图形分析 物体识别和检测 注意点: 二值化 或者 Canny操作 画轮廓时会修改输入的图像 API:findContours(img, mode, ApproximationMode...) 两个返回值:contours(轮廓列表) 、 hierarchy(层级) mode取值: RETR_EXTERNAL = 0,表示只检测外轮廓 RETR_LIST = 1, 检测的轮廓不建立等级关系,从右到左,从里到外 RETR_CCOMP = 2,每层最多2级 RETR_TREE = 3,按树形存储轮廓,从右到左,从大到小 ApproximationMode CHAIN_APPROX_NONE,保存所有轮廓上的点 CHAIN_APPROX_SIMPLE,只保存角点(数据量小) 绘制轮廓 drawContours(img, contours, contourIdx, color, thickness...) contourIdx: -1,表示所有轮廓 color: (0,0,255) thickness: 线宽,-1填充 轮廓面积和周长 contourArea(contour) contour: contour arcLength(curve,closed) curve: contour closed: 是否闭合 多边形逼近与凸包 多边形逼近:减少存储数据量,存储特征点,即可满足需求 凸包:存放轮廓,有时候只需要了解轮廓,就可以做相应处理,不需要很多细节 approx: approxPolyDP(curve, epsilon, closed) curve: contour epsilon: 精度 closed: 是否闭合 hull: convexHull(points, clockwise,...) points: contour clockwise: 顺时针/逆时针 外接矩形 最小外接矩形: minAreaRect(points) points: contour 返回:RotatedRect x,y width,height angle 最大外接矩形: boundingRect(array) array: contour 返回:rect # 特征检测 OpenCV特征的场景 1. 图像搜索,以图搜图 2. 拼图游戏 寻找特征 特征是唯一的 可追踪的 可比较的 3. 图像拼接,将两张有关联的图拼接到一起 图像特征:有意义的图像区域,具有独特性,易于识别性,比如角点、斑点以及高密度区 角点: 在特征中最重要的是角点 灰度地图的最大值对应的像素 两条线的角点 极值点(一阶导数最大值,但二阶导数为0) Harris角点检测 定义衡量窗口 光滑:无论向哪里移动,衡量系数不变 边缘:垂直边缘移动时,衡量系数变化剧烈 角点:王哪个方向移动,衡量系数都变化剧烈 cornerHarris(img, dst, blockSize, ksize, k) blockSize: 检测窗口大小 ksize: Sobel的卷积核 k: 权重系数,经验值,一般取 0.02 - 0.04 之间 Shi-Tomasi角点检测 Shi-Tomasi是Harris角点检测的改进 Harris角点检测算法的稳定性和k有关,而k是各简言之,不好设定最佳值,Shi-Tomasi解决了这个问题 goodFeaturesToTrack(img, maxCorners,...) maxCorners: 角点的最大数量,0标识无限制 qualityLevel:角点质量,小于1.0的正数,一般在0.01-0.1之间 minDistance: 角点之间的最小欧氏距离,忽略小于此距离的点 mask:感兴趣的区域 blockSize:检测窗口大小 useHarrisDetector:是否使用Harris算法,默认false,不适用Harris,而使用Shi-Tomasi k:默认是0.04 SIFT: Scale-Invariant Feature Transform SIFT出现原因: Harris角点具有旋转不变的特性 但缩放后,原来的角点可能就不是角点了 图放大,角点可能变成边缘 使用SIFT的步骤 创建SIFT对象 进行检测,kp = sift.detect(img, ...) 绘制关键点:drawKeypoints(gray, kp, img) 计算SIFT描述子 关键点:位置,大小、方向 关键点描述子:记录了关键点周围对其有贡献的像素点的一组向量值,其不受仿射变换、光照变换等影像 kp, desc = sift.detectAndCompute(img, kp) 描述子作用:特征匹配 SURF:Speeded-Up Robust Features 加速的特征检测 SIFT最大问题是速度慢,因此才有SURF surf = cv2.xfeatures2d.SURF_create() kp, desc = surf.detectAndCompute(img, kp) ORB:Oriented FAST and Rotaged BRIEF ORB可以做到实时检测 FAST:可以做到特征点的实时检测 BRIEF:对一检测到的特征点进行描述,加快了特征描述符建立的速度,同时也极大的降低了特征匹配的时间 免费,无版权问题 orb = cv2.ORB_create() kp, desc = orb.detectAndCompute(img, mask) 总结: SIFT - 速度最慢 SURF - 改进了速度 ORB - 实时 特征匹配方法 BF(Brute-Force),暴力特征匹配方法 使用第一组中的每个特征的描述子与第二组中的所有特征描述子进行匹配 计算他们之间的差距,然后将最接近的一个匹配返回 创建匹配器:BFMatcher(normType, crossCheck) normType: NORM_L1, NORM_L2(默认), HAMMING1(ORB)... 特征匹配:bf.match(desc1, desc2) 绘制匹配点:cv2.drawMatches(img1, kp1, img2, kp2,match) FLANN: 在进行批量特征匹配时,FLANN速度更快 由于它使用的是邻近近似值,所以精度较差 创建匹配器:FlannBasedMatcher(...) index_params:匹配算法KDTREE(SIFT/SURF), LSH(ORB) 特征匹配:flann.match/knnMatch(...) 绘制匹配点:cv2.drawMathches / cv2.drawMatchesKnn(...) 图像查找 特征匹配 + 单应性矩阵 图片合并步骤 读文件并重置尺寸 根据特征点计算描述子,得到单应性矩阵 图像变换 图像拼接 输出图像 三、DNN图像分类 DNN为深度神经网络,并且是全连接的形式; 注意:OpenCV能够使用DNN模型,但并不能训练; DNN使用步骤: 读取模型,得到网络结构; 读取数据(图片或视频) 将图片转成张量,送入网络; 模型输出结果; 函数原型: 导入模型:readNet(model,[config]) 图像转张量:blobFromImage(image,scalefactor,size,mean,swapRB,crop) 送入网络:net.setInput(blob) 模型推理:net.forward()