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. 07JavaScript数组与字符串对象

    JavaScript数组与字符串对象 5.1.1数组(Array)对象 <script> //声明一个数组并赋值; var arr = new Array("aa",& ...

  2. 获取url上的参数

    var aa = '?name=hss&age=13';        function strToObj(str){            if(typeof str === 'undefi ...

  3. 微信小程序 video组件 不随页面滚动

    1.页面初始化(滚动前)时,video所在位置 2.页面滚动后,video视频组件所在位置 看了别人家的小程序并不会出现这种状况.最后检查发现,是页面包裹层设置了 height:100% 导致的 顺便 ...

  4. 在Linux中CSV转换成XLSX

    在linux中,把csv文件转换成excel表格(xlsx或者xls) $ echo -e 'surname,name,age\nCarlo,Smith,23\nJohn,Doe,46\nJane,D ...

  5. 树莓派 - RPi.GPIO

    RPi.GPIO是通过Python/C API实现的,C代码操作底层寄存器, python通过Python/C API调用这些C接口. 这是关于RPi.GPIO项目的介绍. 其中提到了有python ...

  6. Codeforces450 B. Jzzhu and Sequences

    B. Jzzhu and Sequences time limit per test 1 second memory limit per test 256 megabytes input standa ...

  7. Java ExecutorService四种线程池的例子与说明(转发)

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...

  8. git-svn操作

    1.git svn clone --username=chenzheng   http://10.0.0.178/repos/trunk/hxqcgf/auto_accessories.admin.h ...

  9. DRF JWT的用法 & Django的自定义认证类 & DRF 缓存

    JWT 相关信息可参考: https://www.jianshu.com/p/576dbf44b2ae DRF JWT 的使用方法: 1. 安装 DRF JWT # pip install djang ...

  10. 被老板逼着实现了Excle的透视表分析算法

    package com.example.demo; import java.sql.SQLException;import java.util.ArrayList;import java.util.H ...