600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > opencv-python 实现角点检测和棋盘角点检测

opencv-python 实现角点检测和棋盘角点检测

时间:2019-09-30 21:03:59

相关推荐

opencv-python 实现角点检测和棋盘角点检测

作者:RayChiu_Labloy

版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

目录

利用goodFeaturesToTrack()角点检测:

利用findChessboardCorners()检测棋盘板内角点,cornerSubPix()亚像素精细化检测结果:

goodFeaturesToTrack()和findChessboardCorners()区别:

利用goodFeaturesToTrack()角点检测:

函数的参数说明:

def goodFeaturesToTrack(image: Any【输入图像,是八位的或者32位浮点型,单通道图像,所以有时候用灰度图】,maxCorners: Any【返回最大的角点数,是最有可能的角点数,如果这个参数不大于0,那么表示没有角点数的限制】,qualityLevel: Any【图像角点的最小可接受参数,质量测量值乘以这个参数就是最小特征值,小于这个数的会被抛弃】,minDistance: Any【返回的角点之间最小的欧式距离】,corners: Any = None,mask: Any = None【检测区域。如果图像不是空的(它需要具有CV_8UC1类型和与图像相同的大小),它指定检测角的区域】,blockSize: Any = None【用于计算每个像素邻域上的导数协变矩阵的平均块的大小】,useHarrisDetector: Any = None【选择是否采用Harris角点检测,默认是false. k: Harris检测的自由参数】,k: Any = None) -> None

实验图片:

实验结果:

测试代码:

import cv2import numpy as np"""角点检测 goodFeaturesToTrack()"""img = cv2.imread("E:/Users/raychiu/Desktop/825.bmp")gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)corners = cv2.goodFeaturesToTrack(gray, 150, 0.3, 50)corners = np.int0(corners)for corner in corners:x, y = corner.ravel()cv2.circle(img, (x, y), 5, (0, 0, 255), -1)# 缩小图像height, width = img.shape[:2]size = (int(width * 0.4), int(height * 0.4))img = cv2.resize(img, size, interpolation=cv2.INTER_AREA)cv2.imshow("img", img)cv2.waitKey(0)cv2.destroyAllWindows()

利用findChessboardCorners()检测棋盘板内角点,cornerSubPix()亚像素精细化检测结果:

findChessboardCorners(image: Any,patternSize: Any,corners: Any = None,flags: Any = None) 三个参数:

image:输入原始的棋盘板图像。该图像必须是一张8位的灰度图或色彩图。

patternSize:(w,h),棋盘上每一排和每一列的内角数。w=棋盘板一行上黑白块的数量-1,h=棋盘板一列上黑白块的数量-1,例如:10x6的棋盘板,则(w,h)=(9,5)

corners:array,检测到的角点的输出数组。

flags:int,不同的操作标记,能够为0或者下述值的组合:

CALIB_CB_ADAPTIVE_THRESH 使用自适应阈值法把图像转换为黑白图,而不是使用一个固定的阈值。 CALIB_CB_NORMALIZE_IMAGE 在利用固定阈值或自适应阈值法二值化图像之前,利用直方图均衡化图像。 CALIB_CB_FILTER_QUADS 使用额外的标准(如轮廓面积,周长,正方形形状)来过滤掉在轮廓检索阶段提取的假四边形。 CALIB_CB_FAST_CHECK 对图像运行一个快速检查机制以查找棋盘板的角点,如果没有找到角点则返回一个快捷提醒。当没有观察到棋盘时,可以极大地加快在退化条件下的调用。

cornerSubPix(image: Any,corners: Any,winSize: Any,zeroZone: Any,criteria: Any)五个参数:

第一个参数 是输入图像,灰度左图

第二个参数是检测到的角点,即是输入也是输出。

第三个参数是计算亚像素角点时考虑的区域的大小,大小为NXN; N=(winSize*2+1)。

第四个参数作用类似于winSize,但是总是具有较小的范围,通常忽略(即Size(-1, -1))。

第五个参数用于表示计算亚像素时停止迭代的标准

测试图片:

测试结果:

测试代码:

# -*- coding: utf-8 -*-import cv2# 查找棋盘格 角点criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.1)# 棋盘格参数corners_vertical = 6 # 纵向角点个数;corners_horizontal = 7 # 横向角点个数;pattern_size = (corners_vertical, corners_horizontal)def find_corners_sb(img):"""查找棋盘格角点函数 SB升级款:param img: 处理原图"""gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 查找棋盘格角点;ret, corners = cv2.findChessboardCornersSB(gray, pattern_size, cv2.CALIB_CB_EXHAUSTIVE + cv2.CALIB_CB_ACCURACY)if ret:# 精细查找角点corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)# 显示角点cv2.drawChessboardCorners(img, pattern_size, corners2, ret)def find_corners(img):"""查找棋盘格角点函数:param img: 处理原图"""gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 查找棋盘格角点;ret, corners = cv2.findChessboardCorners(gray, pattern_size, cv2.CALIB_CB_ADAPTIVE_THRESH +cv2.CALIB_CB_FAST_CHECK +cv2.CALIB_CB_FILTER_QUADS)if ret:# 精细查找角点corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)# 显示角点cv2.drawChessboardCorners(img, pattern_size, corners2, ret)def main():# 1.创建显示窗口cv2.namedWindow("img", 0)cv2.resizeWindow("img", 1075, 900)file_path = ('./1.jpg')img_src = cv2.imread(file_path)if img_src is not None:# 执行查找角点算法find_corners_sb(img_src)# find_corners(img_src)# 显示图片cv2.imshow("img", img_src)cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == '__main__':main()

goodFeaturesToTrack()和findChessboardCorners()区别:

goodFeaturesToTrack()是针对全幅图像找角点的,findChessboardCorners()是专门检测棋盘板内角点的函数

【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。