opencv 基本操作,上采样,下采样,图像金字塔,高斯差分(DOG)
本章内容:
1.上采样
2.下采样
3.图像金字塔
4.高斯差分(DOG)
1. 上采样
输出结果
2.下采样
输出结果
3. 图像金字塔
4.高斯差分(DOG)
输出结果
代码
#include <ostream>
#include <opencv.hpp>int main(int argc, char *argv[])
{
/*
本章内容:
1.上采样
2.下采样
3.图像金字塔
4.高斯差分(DOG)*/
cv::String fileName = "/home/wang/dev/Image/cdut.jpeg";
cv::Mat src = cv::imread(fileName);
if(src.data == NULL){
printf("图像读入失败\n");
return -1;
}
/* 1. 上采样
api接口:CV_EXPORTS_W void pyrUp( InputArray src, OutputArray dst,
const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );
参数分析:
@param dstsize size of the output image.//输出图像大小
*/
cv::Mat dstUp;
// cv::pyrUp(src, dstUp, cv::Size(src.rows * 2, src.cols * 2)); // 报错
cv::pyrUp(src, dstUp, cv::Size(src.cols * 2, src.rows * 2)); // 正确
cv::imshow("src", src);
cv::imshow("pyrUp", dstUp);/*2.下采样
api接口:
*/
cv::Mat dstDown;
cv::pyrDown(src,dstDown,cv::Size(src.cols / 2, src.rows / 2));
cv::imshow("pyrDown", dstDown);
/*3.图像金字塔
*/
cv::Mat dstDown1;
cv::pyrDown(dstDown,dstDown1,cv::Size(dstDown.cols/2,dstDown.rows/2));
cv::imshow("dstDown1", dstDown1);/*4.高斯差分(DOG)
Gaussian(x,y,k*rou) - Gaussian(x,y,rou)
计算过程:
1. 彩色图像转灰度图像
2. 高斯光滑获得不同尺度下的图像
3. 不同尺度下的高斯光滑吐下做差分
*/
/*
api接口:CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
参数分析:
@param code color space conversion code (see #ColorConversionCodes).
enum ColorConversionCodes{
COLOR_BGR2BGRA = 0,
COLOR_RGB2RGBA = COLOR_BGR2BGRA,
COLOR_BGRA2BGR = 1,
COLOR_RGBA2RGB = COLOR_BGRA2BGR,
}
*/
cv::Mat dstGray;
cv::cvtColor(src,dstGray, cv::COLOR_BGR2GRAY);
cv::Mat G1;
cv::Mat G2;
cv::Mat DOG;
cv::GaussianBlur(dstGray,G1,cv::Size(5,5),5.0);
cv::GaussianBlur(G1,G2,cv::Size(5,5),5.0);
cv::subtract(G2,G1,DOG);
/* 矩阵标准化
api接口:CV_EXPORTS_W void normalize( InputArray src, InputOutputArray dst, double alpha = 1, double beta = 0,
int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());
参数:
@param alpha 标准化最大值
@param beta 无效值
@param norm_type normalization type (see cv::NormTypes).
enum cv::NormTypes:
NORM_INF = 1,
NORM_L1 = 2,
NORM_L2 = 4,
NORM_L2SQR = 5,
NORM_HAMMING = 6,`
NORM_HAMMING2 = 7,
NORM_TYPE_MASK = 7,
NORM_RELATIVE = 8,
NORM_MINMAX = 32
*/
cv::normalize(DOG, DOG, 255, 0, cv::NORM_MINMAX);
cv::imshow("dstGray", dstGray);
cv::imshow("G1",G1);
cv::imshow("G2",G2);
cv::imshow("DOG",DOG);cv::waitKey(0);
return 1;
}
pyrUp中行列问题上采样中行列问题
上采样的行列与矩阵的行列相反
报错结果:
terminate called after throwing an instance of 'cv::Exception'
what(): OpenCV(4.4.0-dev) /home/wang/opencv/opencv/modules/imgproc/src/pyramids.cpp:923: error: (-215:Assertion failed) std::abs(dsize.width - ssize.width*2) == dsize.width % 2 && std::abs(dsize.height - ssize.height*2) == dsize.height % 2 in function 'pyrUp_'