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

Main函数

#include "stdafx.h"
#include "MorphoFeatures.h"
#include "WatershedSegmenter.h"
int main()
{    cv::Mat img = cv::imread("../../aTestImage/Building.jpg", 0);//cv::IMREAD_GRAYSCALE
	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 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));
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

惊鸿一博

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值