• 大小: 5KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-13
  • 语言: C/C++
  • 标签: 高斯  金字塔  

资源简介

实现高斯金字塔和高斯差分金字塔,采用opencv实现的对图像建立高斯金字塔与高斯差分金字塔。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 

using namespace std;
using namespace cv;

static const int   GAUSS_ADD_INTERVALS = 3;
static const int   DOG_ADD_INTERVALS = 2;
static const float SIFT_INIT_SIGMA = 0.5f;

int _computeOctaves(const cv::Mat& vGrayImage);

void _convertToGray(const cv::Mat& vSrcImage cv::Mat& voGrayImage);
void _createInitImage(const cv::Mat& vSrcImage bool vDoubleImageSize double vSigma cv::Mat& voInitImage);
void _buildGaussPyramid(const cv::Mat& vImage int vIntervals double vSigma std::vector& voGaussPyramid);
void _buildDoGPyramid(const std::vector& vGaussPyramid int vIntervals std::vector& voDoGPyramid);

int main()
{
cv::Mat image = cv::imread(“1.jpg“1);

if (!image.data)
{
std::cout << “Could not open or find the image!“ << std::endl;
return -1;
}

cv::Mat InitImage;

std::vector gaussPyr;
std::vector doGpyr;

_createInitImage(image false 1.6 InitImage);
_buildGaussPyramid(InitImage 3 1.6 gaussPyr);
_buildDoGPyramid(gaussPyr 3 doGpyr);

vector DisGauss(gaussPyr.size());
for (int i = 0; i < (signed int)gaussPyr.size(); ++i)
{
gaussPyr[i].convertTo(DisGauss[i] DataType::type 100 0);
std::ostringstream oss;
oss << i;
std::string str = oss.str();
std::string name = “gaussPyr“ + str;
cv::imshow(name DisGauss[i]);
}

for (int j = 0; j < doGpyr.size(); ++j)
{
std::ostringstream oss;
oss << j;
std::string str = oss.str();
std::string name2 = “DoGPyr“ + str;
cv::imshow(name2 doGpyr[j]);
}

cvWaitKey(0);
return 0;
}

//******************************************************************
//FUNCTION:
int _computeOctaves(const cv::Mat& vGrayImage)
{
int OctavesNum;

OctavesNum = cvRound(log(MIN(vGrayImage.size().width vGrayImage.size().height)) / log(2)) - 2;

return OctavesNum;
}

//******************************************************************
//FUNCTION:
void _convertToGray(const cv::Mat& vSrcImage cv::Mat& voGrayImage)
{
Mat gray;

if (vSrcImage.channels() == 3 || vSrcImage.channels() == 4)
cv::cvtColor(vSrcImage gray cv::COLOR_BGR2GRAY);
else
vSrcImage.copyTo(gray);
//voGrayImage = gray;
gray.convertTo(voGrayImage DataType::type 1.0 0);
}

//******************************************************************
//FUNCTION:
void _createInitImage(const cv::Mat& vSrcImage bool vDoubleImageSize double vSigma cv::Mat& voInitImage)
{
cv::Mat OrginalImage = vSrcImage;
cv::Mat GrayImage;

_convertToGray(OrginalImage GrayImage);

double SigmaDiff;

if (vDoubleImageSize)
{
SigmaDiff = sqrtf(std

评论

共有 条评论