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对图像进行边缘及角点检測的更多相关文章

  1. opencv2使用形态学滤波对图像进行边缘及角点检測

    #if !defined MORPHOF #define MORPHOF #include <opencv2/core/core.hpp> #include <opencv2/img ...

  2. 使用nodeitk进行角点检測

    前言 东莞,晴,33至27度.今天天气真好,学生陆续离开学校.忙完学生答辩事情,最终能够更新一下nodeitk.本文继续介绍node的特征识别相关内容,你会看到,採用nodeitk实现角点检測是一件十 ...

  3. openCV2马拉松第19圈——Harris角点检測(自己实现)

    计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/26824529 收入囊中 使用OpenCV的con ...

  4. MatLab角点检測(harris经典程序)

    http://blog.csdn.net/makenothing/article/details/12884331 这是源博客的出处,鄙人转过来是为了更好的保存!供大家一起学习!已将原始的博客的文章的 ...

  5. 【OpenCV新手教程之十七】OpenCV重映射 &amp; SURF特征点检測合辑

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/30974513 作者:毛星云(浅墨)  ...

  6. Matlab实现Hough变换检測图像中的直线

    Hough变换的原理: 将图像从图像空间变换至參数空间.变换公式例如以下: 变换以后,图像空间与參数空间存在下面关系: 图像空间中的一点在參数空间是一条曲线,而图像空间共线的各点相应于參数空间交于一点 ...

  7. 图像边缘检測--OpenCV之cvCanny函数

    图像边缘检測--OpenCV之cvCanny函数 分类: C/C++ void cvCanny( const CvArr* image, CvArr* edges, double threshold1 ...

  8. Python下opencv使用笔记(七)(图像梯度与边缘检測)

    梯度简单来说就是求导,在图像上表现出来的就是提取图像的边缘(无论是横向的.纵向的.斜方向的等等),所须要的无非也是一个核模板.模板的不同结果也不同.所以能够看到,全部的这些个算子函数,归结究竟都能够用 ...

  9. OpenCV(5)-图像掩码操作(卷积)-锐化

    锐化概念 图像平滑过程是去除噪声的过程.图像的主要能量在低频部分,而噪声主要集中在高频部分.图像的边缘信息主要也在高频部分,在平滑处理后,将会丢不部分边缘信息.因此需要使用锐化技术来增强边缘. 平滑处 ...

随机推荐

  1. go的指针学习

    1)指针是什么? 一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址 说白了就是可以先存储内存的地址,在用内存地址找到对应值 2)go中的使用 Go 语言的取地址符是 &,放到一个 ...

  2. java关于时间的相关操作

    /** * 获取当天时间零点 * @return */ public Date gettoday(){ SimpleDateFormat sdf = new SimpleDateFormat(&quo ...

  3. 通俗易懂的Redux了解下

    Redux真的让我脑仁疼,感觉有点搞不定他,因为对我而言太抽象了.所以我用通俗易懂地方法去思考Redux,感觉能够理解了. 本文要点: action 配置行为 store.dispatch(actio ...

  4. vue -vantUI tab切换时 list组件不触发load事件解决办法

    最近由于公司项目需要,用vue写了几个简单的页面.用到了vantUI List 列表 瀑布流滚动加载,用于控制长列表的展示 当列表即将滚动到底部时,会触发事件并加载更多列表项. (页面加载完成后默认会 ...

  5. 全国绿色计算大赛 模拟赛第二阶段 (Python)

    第1关气温预测 def dailyTemps(temp_list): result = [] for ca in range(0, len(temp_list)-1): for i in range( ...

  6. PHP经典算法集锦【经典收藏】

    本文实例总结了PHP经典算法.分享给大家供大家参考,具体如下: 1.首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半. 思路:多少行for一次,然后在里面空格和星号for一次. ...

  7. 56.fielddata filter的细粒度内存加载控制

    语法: POST /test_index/_mapping/test_type { "properties": { "test_field": { " ...

  8. 编译时报错,找不到指定路径下的command,而路径是正确的。

    使用的Fedora 18 64位的系统kernel,内核为3.6.10.按照要求使用yum install *** 安装各项工具. path路径使用提供的toolchain,各种路径也安装正确,却发现 ...

  9. 表情符号Emoji的正则表达式

    /** * 判断字符串包含表情 * @param value * @return */ public static boolean containsEmoji(String value){ boole ...

  10. 文件 jq 传到后台

    XMLHttpRequest Level 2 添加了一个新的接口——FormData.与普通的 Ajax 相比,使用 FormData 的最大优点就是我们可以异步上传二进制文件. jQuery 2.0 ...