opencv复杂一点的变换

Posted 2xiaodouya2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv复杂一点的变换相关的知识,希望对你有一定的参考价值。

今天的学习中用到了cvPyrDown函数,cvPyrUp函数,canny函数的用法。在此进行记录,以便以后参考。

使用cvPyrDown()创建一幅宽度和高度均为输入图像一半尺寸的图像

功能:
函数cvPyrDown使用Gaussian金字塔分解对输入图像向下采样。
格式:
void cvPyrDown(
const CvArr*src,
CvArr*dst,
int filter=CV_GAUSSIAN_5x5);
参数:
src输入图像,dst 输出图像,CV_GAUSSIAN_5x5是默认的模版
例子:
void doPyrDown(void) {
IplImage *in=cvLoadImage("lena.jpg");
int filter = IPL_GAUSSIAN_5x5;
assert(in->width%2 == 0 && in->height%2 == 0);//确认长宽像素是偶数(否则无法缩放一半)
IplImage *out=cvCreateImage(cvSize(in->width/2, in->height/2), in->depth, in->nChannels);//创建新图像,长宽各一半,同深度,同通道数
cvPyrDown(in, out); cvNamedWindow("in");
cvNamedWindow("out");
cvShowImage("in", in);
cvShowImage("out", out);
cvWaitKey(0);
cvReleaseImage(&in);
cvReleaseImage(&out);
cvDestroyAllWindows();
}

cvPyrUP将现有的图像在每个维度上放大两倍

cvPyrUP(

IplImage *src,

IplImage *dst,

IplFilter filter=CV_GAUSSIAN_5x5

);

Canny边缘检测
void Canny(InputArray src,OutputArray dst,double threshold1, double threshold2, int apertureSize=3,bool L2gradient=false )

参数详解:

src:源图像 
dst:目标图像。 
threshold1:第一个滞后性阈值。 
threshold2:第二个滞后性阈值。 
apertureSize:表示应用Sobel算子的孔径大小,其有默认值3。 
L2gradient:一个计算图像梯度幅值的标识,有默认值false。

需要注意的是,这个函数threshold1和threshold2两者的小者用于边缘连接,而大者用来控制强边缘的初始段, 推荐的高低阈值比在2:1到3:1之间。

下面是将一幅图调用两次doPyrdown,再用canny处理的例子。

#include "highgui.h"
#include "cv.h"
IplImage* out;
IplImage* doPyrdown(IplImage* in)
{
assert(in->width % 2 == 0 && in->height % 2 == 0);
out = cvCreateImage(
cvSize(in->width / 2, in->height / 2),
in->depth,
in->nChannels
);
cvPyrDown(in, out, CV_GAUSSIAN_5x5);
return (out);
};
IplImage* doCanny(IplImage *in,
double lowThresh,
double highTresh,
int aperture
) {


if (in->nChannels != 1) return (0);
IplImage *out = cvCreateImage(
cvSize(in->width, in->height),
IPL_DEPTH_8U,
1
);
cvCanny(in, out, lowThresh, highTresh, aperture);
return(out);
};
int main(int argc, char** argv)
{
IplImage* img = cvLoadImage("1.jpg", 0);
cvNamedWindow("原图", CV_WINDOW_AUTOSIZE);
cvShowImage("原图", img);
  out = doPyrdown(img);
  out = doPyrdown(out);
out = doCanny(img, 2, 3, 3);

cvNamedWindow("两次缩放和边缘检测", CV_WINDOW_AUTOSIZE);

cvShowImage("两次缩放和边缘检测", out);
cvWaitKey(0);
cvReleaseImage(&out);
cvDestroyWindow("两次缩放和边缘检测");
cvReleaseImage(&img);
cvDestroyWindow("原图");
return 0;
}

 

 

 

以上是关于opencv复杂一点的变换的主要内容,如果未能解决你的问题,请参考以下文章

灰度图像直方图变换的一些代码

C++ OpenCV透视变换改进---直线拟合的应用

灰度图像直方图变换的一些代码

opencv —— HoughLinesHoughLinesP 霍夫线变换(标准霍夫线变换多尺度霍夫线变换累积概率霍夫线变换)

我将如何通过仿射变换在opencv中实现这一点?

pyhton—opencv直线检测(HoughLines)找到最长的一条线