您当前的位置: 首页 >  opencv

惊鸿一博

暂无认证

  • 5浏览

    0关注

    535博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

惊鸿一博 发布时间:2017-03-13 17:43:43 ,浏览量:5

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 
#include 
#include 
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(2, i) = 1;
		cross.at(i, 2) = 1;
	}
	//初始化菱形矩 结构元素
	diamond.at(0, 0) = 0;
	diamond.at(0, 1) = 0;
	diamond.at(1, 0) = 0;
	diamond.at(4, 4) = 0;
	diamond.at(3, 4) = 0;
	diamond.at(4, 3) = 0;

	diamond.at(4, 0) = 0;
	diamond.at(4, 1) = 0;
	diamond.at(3, 0) = 0;
	diamond.at(0, 4) = 0;
	diamond.at(0, 3) = 0;
	diamond.at(1, 4) = 0;

	//初始化X形矩 结构元素
	for (int i = 0; i < 5; i++)
	{
		x.at(i, i) = 1;
		x.at(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_::const_iterator it = binary.begin();
	cv::Mat_::const_iterator itend = binary.end();

	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));
		}
	}
}

关注
打赏
1663399408
查看更多评论
立即登录/注册

微信扫码登录

0.0374s