Corners检测

Harris角点与FAST特征检测

1、Harris Corners角点检测

使用harris corners检测器:

使用OpenCV函数

void cornerHarris( InputArray src, OutputArray dst, int blockSize,
                                int ksize, double k,
                                int borderType=BORDER_DEFAULT );

参数:

blockSize:感兴趣点周围邻居矩阵大小

ksize:孔径大小与sobel方法中的参数一样

k:计算像素点强度值的系数

dst:存放各个像素点的average intensity change值,越大说明越有可能是角点

average internsity change的计算方法:

参考:1、《OpenCV CookBook》P199

         2、http://blog.youkuaiyun.com/crzy_sparrow/article/details/7391511

在《OpenCV CookBook》中对Harris Corners检测器稍稍做了改善,加入了非极大值抑制,也即不但感兴趣点的average internsity change要满足大于threshold,也要是局部极大值

部分代码如下:

	void detect(cv::Mat image)
	{
		cv::cornerHarris(image , cornersStrength ,
			ksize , aperture , k) ;
	}

	cv::Mat  getCornersMap(double threshold)
	{
		double minStrength ;
		cv::minMaxLoc(cornersStrength , &minStrength , &maxStrength) ;
		cv::Mat dilate ;
		cv::dilate(cornersStrength , dilate , cv::Mat()) ;//dilate后只有局部极大值没有改变

		cv::compare(cornersStrength , dilate , localMax , cv::CMP_EQ) ;//因局部极大值未变,所以只有局部极大值出为1
		threshold = threshold * maxStrength ;

		cv::threshold(cornersStrength , cornersMap , threshold , 255 , cv::THRESH_BINARY) ;//强度值满足>threshold
		cornersMap.convertTo(cornersMap , CV_8U) ;
		cv::bitwise_and(cornersMap , localMax , cornersMap) ;//结合得到满足两个条件的点定义为角点
		return cornersMap ;
	}

	void drawImage(cv::Mat &image)
	{
		std::vector<cv::Point> points ;
		for(int i = 0 ; i < cornersMap.rows ; ++ i)
		{
			const uchar * ptr = cornersMap.ptr(i) ;
			for(int j = 0 ; j < cornersMap.cols ; ++ j)
			{
				if(ptr[j])
				{
					points.push_back(cv::Point(j , i)) ;//注意顺序是先X坐标 ,再Y坐标
				}
			}
		}
		std::vector<cv::Point>::const_iterator itc = points.begin() ;
		while (points.end() != itc)
		{
			cv::circle(image , *itc , 3 , cv::Scalar(255) , 2) ;
			itc ++ ;
		}
	}

2、FAST(Features from Accelerated Segment Test)  Feature 

思想:给定候选像素点,指定半径,若圆上连续的超过圆周长3/4的像素点的比候选的中间点明亮或者暗淡,则认为候选点是一个keyPoint,可以使用一个快速判断的技巧:我们先预判断中心点上下左右四个点,它们中至少要有三个符合以上条件才有可能是keyPoint,我们可以先使用这个方法先预判一下。

代码:

	cv::Mat image =  cv::imread ("D:/Development/OpenCV/images/church01.jpg"  , 0);

	std::vector<cv::KeyPoint> keyPoints ;
	cv::FastFeatureDetector FastFD(40) ;
	FastFD.detect(image , keyPoints) ;
	cv::Mat timage = cv::imread ("D:/Development/OpenCV/images/church01.jpg") ;
	cv::drawKeypoints(image , keyPoints , timage , 
		cv::Scalar(-1 , -1 , -1) , cv::DrawMatchesFlags::DRAW_OVER_OUTIMG) ;

因其快速性常常用在视觉追踪中


参考:http://blog.youkuaiyun.com/skeeee/article/details/9405531

OpenMV 是一个嵌入式视觉处理平台,广泛用于图像识别和机器视觉任务。`corners` 函数是 OpenMV 中用于检测图像中角点(corner points)的工具之一,通常用于特征提取、对象检测或跟踪等场景。 ### `corners` 函数的用途 - **角点检测**:该函数可以检测图像中的角点位置,这些角点通常是图像中具有显著变化的方向点,适用于匹配、定位等任务。 - **模板匹配辅助**:在一些情况下,`corners` 可以与模板匹配算法结合使用,帮助提高匹配精度。 - **特征描述子生成**:角点信息可用于后续的特征描述子计算,例如 ORB、FAST 等关键点检测方法的预处理步骤[^1]。 ### 使用方法 在 OpenMV IDE 中,可以通过以下方式调用 `corners` 函数: ```python img = sensor.snapshot() corners_list = img.find_corners(threshold=10000, min_corners=20, neighborhood=2) ``` #### 参数说明: - `threshold`:控制角点检测的灵敏度。值越大,检测到的角点越少但更可靠。 - `min_corners`:返回结果中至少需要包含的角点数量。 - `neighborhood`:用于角点检测的邻域大小,影响检测的局部性。 #### 返回值: - 返回一个列表,每个元素是一个包含 `(x, y)` 坐标的元组,表示检测到的角点坐标。 ### 示例代码 以下是一个完整的示例,展示如何使用 `corners` 函数并绘制检测到的角点: ```python import sensor, image, time sensor.reset() sensor.set_pixformat(image.GRAYSCALE) # 设置为灰度图 sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time=2000) clock = time.clock() while(True): clock.tick() img = sensor.snapshot() corners_list = img.find_corners(threshold=10000, min_corners=20) if corners_list: for corner in corners_list: x, y = corner img.draw_circle(x, y, 5, color=(255, 0, 0)) # 绘制角点 print("FPS: %f" % clock.fps()) ``` ### 注意事项 - 图像质量对角点检测效果有较大影响,建议在检测前进行适当的滤波或二值化处理。 - 检测速度受图像分辨率影响,高分辨率可能导致帧率下降[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值