opencv对图像进行边缘及角点检测

opencv对图像进行边缘及角点检测

先看结果:

代码:

// ConsoleApplication1_812.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "opencv2/opencv.hpp"

class Imagedetector{
public:
	Imagedetector():threshold(-1)
	,cross(5,5,CV_8U,cv::Scalar(0))  //初始化十字、菱形、方形、X形结构元素
	,diamond(5,5,CV_8U,cv::Scalar(1))
	,square(5,5,CV_8U,cv::Scalar(1))
	,x(5,5,CV_8U,cv::Scalar(0))
	{
		for(int i = 0;i < 5;++i){
			cross.at<uchar>(2,i) = 1;
			cross.at<uchar>(i,2) = 1;
		}

		diamond.at<uchar>(0,0)= 0;
		diamond.at<uchar>(0,1)= 0;
		diamond.at<uchar>(1,0)= 0;
		diamond.at<uchar>(4,4)= 0;
		diamond.at<uchar>(3,4)= 0;
		diamond.at<uchar>(4,3)= 0;
		diamond.at<uchar>(4,0)= 0;
		diamond.at<uchar>(4,1)= 0;
		diamond.at<uchar>(3,0)= 0;
		diamond.at<uchar>(0,4)= 0;
		diamond.at<uchar>(0,3)= 0;
		diamond.at<uchar>(1,4)= 0;
		for(int i = 0; i<5;++i)
		{
			x.at<uchar>(i,i) = 1;
			x.at<uchar>(4-i,i) = 1;
		}

	}
	void setThreshold(int thr){threshold = thr;}
	cv::Mat getEdges(const cv::Mat &image){

		cv::Mat result;
		cv::morphologyEx(image,result,cv::MORPH_GRADIENT,cv::Mat());
		appThreshold(result);
		return result;
	}
	void appThreshold(cv::Mat &image){

		if(threshold > 0)
			cv::threshold(image,image,threshold,255,cv::THRESH_BINARY);
	}
	cv::Mat getCornres(const cv::Mat &image){

		cv::Mat result;

		cv::dilate(image,result,cross);
		cv::erode(result,result,diamond);

		cv::Mat result2;
		cv::dilate(image,result2,x);
		cv::erode(result2,result2,square);

		cv::absdiff(result2,result,result);
		appThreshold(result);
		return result;
	}
	void drawImage(const cv::Mat binary,cv::Mat image){
		cv::Mat_<uchar>::const_iterator it= binary.begin<uchar>();
		cv::Mat_<uchar>::const_iterator itend= binary.end<uchar>();

		for (int i=0; it!= itend; ++it,++i) {
			if (!*it)
				cv::circle(image,cv::Point(i%image.step,i/image.step),5,cv::Scalar(255,0,0));
		}
	}

private:
	int threshold;
	cv::Mat cross;
	cv::Mat diamond;
	cv::Mat square;
	cv::Mat x;
};

int _tmain(int argc, _TCHAR* argv[])
{
	Imagedetector detector;
	detector.setThreshold(40);

	cv::Mat image = cv::imread("building.jpg",0);
	if(!image.data)
		return -1;
	cv::Mat edges = detector.getEdges(image);
	cv::namedWindow("test",CV_WINDOW_AUTOSIZE);
	cv::imshow("test",edges);

	cv::Mat corners = detector.getCornres(image);
	cv::morphologyEx(corners,corners,cv::MORPH_TOPHAT,cv::Mat());
	cv::threshold(corners, corners, 40, 255, cv::THRESH_BINARY_INV);
	detector.drawImage(corners,image);
	cv::namedWindow("corners",CV_WINDOW_AUTOSIZE);
	cv::imshow("corners",image);
	cv::waitKey(0);
	return 0;
}

原理稍后再说。

opencv对图像进行边缘及角点检测,布布扣,bubuko.com

时间: 2024-10-01 06:44:20

opencv对图像进行边缘及角点检测的相关文章

形态学滤波(3):使用形态学滤波对图像进行边缘及角点检测.

1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 4 using namespace std; 5 using namespace cv; 6 7 //首先定义MorphoFeatures类,我们将使用它来检测图像特征 8 class MorphoFeatures { 9 private: 10 int threShold; //用于生成二值图像的阈值 11 Mat cross; //角点检测中用到的结构元素 12 Mat

图像特征检测之Harris角点算法

        图像检测是图像分割,图像识别的基础,也是不可缺少的关键.在视觉计算理论框架中,抽取二维图像的边缘.角点.纹理等基本特征,是整个框架的第一步:本文章对Harris角点算法做了比较详细的理论介绍以及相关实现. Part One:角点类型介绍 在现实世界中,角点对应于物体的拐角,道路的十字路口.丁字路口等.从图像分析的角度来定义角点可以有以下两种定义: 角点可以是两个边缘的角点: 角点是邻域内具有两个主方向的特征点                                    

Emgucv使用Harris角点检测和Fast角点检测

角点是两个边缘的连接点,代表了两个边缘变化的方向上的点,在这点上图像梯度有很高的变化.是图像中的重要特征点.在opencv中还有改进版的Harris角点检测:Shi-Tomasi 角点检测算法,但在Emgucv里并没有封装,所以目前无法直接使用. 一.Harris角点检测 Harris角点检测通过判断点在水平和竖直方向上的变化程度来判断是否为角点,使用CornerHarris函数,处理后再用阈值来判断是否为角点. public partial class Form1 : Form { publi

【OpenCV十六新手教程】OpenCV角检测Harris角点检测

本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/29356187 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本号: 2.4.9 本篇文章中,我们一起探讨了OpenCV

OpenCV使用Harris算法实现角点检测

纯粹阅读,请移步OpenCV使用Harris算法实现角点检测 效果图 源码 KqwOpenCVFeaturesDemo 角点是两条边缘的交点或者在局部邻域中有多个显著边缘方向的点.Harris角点检测是一种在角点检测中最常见的技术. Harris角点检测器在图像上使用滑动窗口计算亮度的变化. 封装 这里用到了RxJava.主要是因为图片处理是耗时操作,会阻塞线程,为了防止界面卡顿,这里使用RxJava进行了线程切换. /** * Harris角点检测 * * @param bitmap 要检测的

图像特征检测:Harris角点

1. 不同类型的角点 在现实世界中,角点对应于物体的拐角,道路的十字路口.丁字路口等.从图像分析的角度来定义角点可以有以下两种定义: 角点可以是两个边缘的角点: 角点是邻域内具有两个主方向的特征点:        前者往往需要对图像边缘进行编码,这在很大程度上依赖于图像的分割与边缘提取,具有相当大的难度和计算量,且一旦待检测目标局部发生变化,很可能导致操作的失败.早期主要有Rosenfeld和Freeman等人的方法,后期有CSS等方法. 基于图像灰度的方法通过计算点的曲率及梯度来检测角点,避免

OpenCV探索之路(十五):角点检测

角点检测是计算机视觉系统中用来获取图像特征的一种方法.我们都常说,这幅图像很有特点,但是一问他到底有哪些特点,或者这幅图有哪些特征可以让你一下子就识别出该物体,你可能就说不出来了.其实说图像的特征,你可以尝试说一下这幅图有几个矩形啊几个圆形啊,有几条直线啊,当然啦,你也可以说一下有几个角点. 什么是角点? 角点通常被定义为两条边的交点.比如,三角形有三个角,矩形有四个角,这些就是角点,也是他们叫做矩形.三角形的特征,我们看到一些几何图形具有三个角,那么我们便可以脱口而出说这是一个三角形. 上面所

【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测

角点 特征检测与匹配是Computer Vision 应用总重要的一部分,这需要寻找图像之间的特征建立对应关系.点,也就是图像中的特殊位置,是很常用的一类特征,点的局部特征也可以叫做“关键特征点”(keypoint feature),或“兴趣点”(interest point),或“角点”(conrner). 关于角点的具体描述可以有几种: 一阶导数(即灰度的梯度)的局部最大所对应的像素点: 两条及两条以上边缘的交点: 图像中梯度值和梯度方向的变化速率都很高的点: 角点处的一阶导数最大,二阶导数

[OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (一)

部分 V图像特征提取与描述 29 理解图像特征 目标本节我会试着帮你理解什么是图像特征,为什么图像特征很重要,为什么角点很重要等.29.1 解释 我相信你们大多数人都玩过拼图游戏吧.首先你们拿到一张图片的一堆碎片,要做的就是把这些碎片以正确的方式排列起来从而重建这幅图像.问题是,你怎样做到的呢?如果把你做游戏的原理写成计算机程序,那计算机就也会玩拼图游戏了.如果计算机可以玩拼图,我们就可以给计算机一大堆自然图片,然后就可以让计算机把它拼成一张大图了.如果计算机可以自动拼接自然图片,那我们是不是可