Main函数

#include "stdafx.h"
#include "MorphoFeatures.h"
#include "WatershedSegmenter.h"
int main()
{    cv::Mat img = cv::imread("../../aTestImage/Building.jpg", 0);//cv::IMREAD_GRAYSCALEMorphoFeatures morp;morp.setThreshold(-1);cv::Mat corners=morp.getCorners(img);//获取梯度(gradient)图像 //均匀变化的像素被过滤掉 //得到角点图像的 边缘图像cv::morphologyEx(corners, corners, cv::MORPH_TOPHAT, cv::Mat());cv::threshold(corners, corners, 40, 255, cv::THRESH_BINARY_INV);//阈值化角点图像//cv::namedWindow("corners1", 1);//cv::imshow("corners1", corners);morp.drawOnImage(corners, img);cv::namedWindow("imgCorn" );cv::imshow("imgCorn", img );    MorphoFeatures morp;morp.setThreshold(-1);cv::Mat corners=morp.getCorners(img);//获取梯度(gradient)图像 //均匀变化的像素被过滤掉 //得到角点图像的 边缘图像cv::morphologyEx(corners, corners, cv::MORPH_TOPHAT, cv::Mat());cv::threshold(corners, corners, 40, 255, cv::THRESH_BINARY_INV);//阈值化角点图像//cv::namedWindow("corners1", 1);//cv::imshow("corners1", corners);morp.drawOnImage(corners, img);cv::namedWindow("imgCorn" );cv::imshow("imgCorn", img );

MorphoFeatures.h

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
class MorphoFeatures
{
public:MorphoFeatures();~MorphoFeatures();cv::Mat getEdges(const cv::Mat &image);//边缘检测void applyThreshold(cv::Mat &result);void setThreshold(int d);cv::Mat getCorners(const cv::Mat &image);//角点检测void drawOnImage(const cv::Mat &binary, cv::Mat &image);
private:int threshold;//阈值cv::Mat  cross;//十字矩阵cv::Mat  diamond;//菱形矩阵cv::Mat square;//正方形矩阵cv::Mat x;//x形矩阵
};

MorphoFeatures.cpp

#include "stdafx.h"
#include "MorphoFeatures.h"MorphoFeatures::MorphoFeatures():threshold(-1),cross(5, 5, CV_8U, cv::Scalar(0)),diamond(5, 5, CV_8U, cv::Scalar(1)),square(5, 5, CV_8U, cv::Scalar(1)),x(5, 5, CV_8U, cv::Scalar(0))
{//threshold = -1;//cross = cv::Mat(5, 5, CV_8U, cv::Scalar(0));//diamond = cv::Mat(5, 5, CV_8U, cv::Scalar(1));//square = cv::Mat(5, 5, CV_8U, cv::Scalar(1));//初始化正方形矩全是1//x = cv::Mat(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;//初始化X形矩 结构元素for (int i = 0; i < 5; i++){x.at<uchar>(i, i) = 1;x.at<uchar>(4 - i, i) = 1;}}MorphoFeatures::~MorphoFeatures()
{
}cv::Mat MorphoFeatures::getEdges(const cv::Mat & image)
{cv::Mat result;cv::morphologyEx(image, result, cv::MORPH_GRADIENT, cv::Mat());//获取梯度(gradient)图像 //均匀变化的像素被过滤掉 //得到边缘图像applyThreshold(result);return result;
}void MorphoFeatures::applyThreshold(cv::Mat & result)
{if (threshold > 0){cv::threshold(result, result, threshold, 255, cv::THRESH_BINARY);}
}void MorphoFeatures::setThreshold(int thre)
{threshold = thre;
}cv::Mat MorphoFeatures::getCorners(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);//X形膨胀cv::erode(result2, result2, square);//正方形腐蚀cv::absdiff(result2, result, result);//结果求差值,得角点图像applyThreshold(result);//阈值化,得二值图像return result;
}void MorphoFeatures::drawOnImage(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){//在原始图像上画像素5*5的圆圈cv::circle(image,cv::Point(i % image.step, i / image.step),5, cv::Scalar( 255,0,0));}}
}

OpenCV_(Corner Detect with Morphology) 基于形态学滤波的角点检测相关推荐

  1. 用matlab实现harris角点检测,基于MatlabGUI的Harris角点检测程序

    基于MatlabGUI的Harris角点检测程序 作 者: Bugzhao Mailto: bugzhao@http://www.doczj.com/doc/fd59aac50c22590102029 ...

  2. 激光雷达角点检测 c语言,一种基于事件帧的角点检测方法与流程

    本发明属于图像处理领域,用于解决基于事件相机的SLAM项目的角点检测. 背景技术: 在过去几十年里,由于计算机视觉算法的研究与发展,人们对机器人感知的兴趣也日益增加.这种传统相机能够捕获相机周围环境的 ...

  3. 【图像检测】基于形态学算法实现空瓶检测matlab代码

    1 简介 近年来,机器视觉为主导的机器人研究工作正逐步推进,这不仅是对以往智能检测技术的有效突破,而且还能实现资源合理配置这一目标,这种类型的机器人 具 有 广 阔的 应 用 前 景.由 此 可见,本 ...

  4. Shi-tomasi角点检测python实现及基于opencv实现 (角点检测、非极大值抑制)

    写在前面: 已经是七月中旬,黄宁然,你依然在这里. 参考文献镇楼: [1]龚思宇宙,基于平面模板的摄像机标定及相关技术研究 [2]汪洋,扫地机器人定位算法设计与嵌入式系统实现 [3]Denny#,[o ...

  5. PCL学习:基于形态学滤波的地面分割

    参考: http://www.pointclouds.org/documentation/tutorials/progressive_morphological_filtering.php#progr ...

  6. 【缺陷检测】基于形态学实现印刷电路板缺陷检测技术附matlab代码

    1 简介 当今,电子工业在国家经济发展中扮演着越来越重要的角色,作为各种电子元器件的高度信息集合,印刷电路板(PCB)被广泛应用在电子工业中的各个领域.经济的不断发展促使电子技术不断地提高,轻薄.便捷 ...

  7. 基于形态学的复杂背景目标检测算法

    1.问题描述: 复杂背景下目标检测存在诸多困难,主要为背景对目标检测的干扰,大量噪声存在导致传统导数边缘检测方法的失效等.本文正是针对上述两点,提出了分割区域图像.利用形态学方法检测目标的新算法:即首 ...

  8. 基于Frangi滤波的视网膜静脉血管检测算法matlab仿真

    目录 1.算法概述 2.仿真效果 3.MATLAB仿真源码 1.算法概述 随着图像数字化处理的快速发展,医学图像处理越来越受到人们的广泛关注.研究表明,人体许多全身性疾病都与眼底血管的异常有着密切的联 ...

  9. 一种基于Harris-Laplace算法的角点检测方法(Matlab代码实现)

  10. 基于光强的角点检测(SUSAN角点检测、FAST角点检测、FAST-ER角点检测)

    Corner Feature Detector(Intensity-Based) 基于光强比较的角点检测,直接比较光强(像素灰度值),而不计算梯度.所以实时性更好,所需的存储空间更小. SUSAN 角 ...

最新文章

  1. Ibatis学习随笔
  2. C#中字节数组与字符串的来回转换
  3. 搜狗·疫情数据爬取(Python)
  4. md加密 16位 32位
  5. 多工作线程获取工作队列简单实现
  6. fckeditor for php 下载,FCKeditor2.3 For PHP 详细整理的使用参考
  7. 作者:王题(1976-),男,中国联合网络通信有限公司网络技术研究院高级工程师。...
  8. 【英语学习】【Daily English】U04 Neighborhood L03 Oh, my bad
  9. java NIO网络编程之SelectionKey
  10. 想用 Python3 破冰人工智能?首先你得懂这些数学方法!
  11. 电脑硬盘分区合并_简单扩容电脑C盘,无需U盘重装系统
  12. 3. Magento 模板制作
  13. 根据IP查询城市(基于ipdb库)
  14. 如何给自己的网站添加小图标
  15. 赛狐ERP「价格利润试算」——精准定价 保证利润最大化
  16. 图片处理工具类ImageHelper
  17. 机器学习笔记六——特征工程之数据预处理
  18. 满分的一份软件测试工程师简历,凭什么?
  19. HPD2368计算机上没有打印机,HPD2368打印机显示堵纸了,打印不了, – 手机爱问
  20. Redis3.0的主从、集群高可用

热门文章

  1. POJ1338 amp; POJ2545 amp; POJ2591 amp; POJ2247 找给定规律的数
  2. 获取时间差xx小时xx分钟前
  3. HDOJ 1251 HDU 1251 统计难题 ACM 1251 IN HDU
  4. 《Vue入门到精通系列》--- 两万字带你入门Vue
  5. Asp.Net删除文件夹后引起Session丢失的解决办法
  6. 个人计算机主板的组成部分,简述计算机主板的基本组成部分
  7. ip申请 web应用_阿里云同时部署DDoS高防IP+CDN+WAF
  8. 短信平台建设方案_五大垂直行业工业互联网平台建设方案
  9. url 收录工具_为什么我的网站不收录??
  10. python 最小二乘回归 高斯核_[数值计算] 数据拟合——非线性最小二乘法