【opencv的学习】各类变换的尝试
2016-08-12 22:36
253 查看
一个简单的变换:载入一副图像进行平滑处理
一个复杂一点的变换:
(1)对图像尺寸进行变换
cvPyrDown为openCV中的一个函数。
功能:
函数cvPyrDown使用Gaussian金字塔分解对输入图像向下采样。
格式:
void cvPyrDown(const CvArr*src,CvArr*dst,int filter=CV_GAUSSIAN_5x5);
参数:
src 输入图像。
dst 输出图像,其宽度和高度应是输入图像的一半。
filter 卷积滤波器类型,目前仅支持CV_GAUSSIAN_5x5。
//函数资料来自百度百科
(2)Canny边缘检测将输出写入一个单通道(灰度级)图像
cvCanny为openCV中的一个函数。
功能:
用于对图像的边缘检测(采用canny算法)。
格式:
void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int aperture_size=3
);
参数:
image 输入单通道图像(可以是彩色图像)对于多通道的图像可以用cvCvtColor()修改。
edges 输出的边缘图像 ,也是单通道的,但是是黑白的
threshold1 第一个阈值
threshold2 第二个阈值
aperture_size Sobel 算子内核大小(可为3,5,7三个数值)
函数 cvCanny 采用 Canny 算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。
//函数资料来自百度百科
[b](3)连续进行两次缩放处理与Canny边缘检测[/b]
在上面的这个程序中,我们不难发现,在最后对不同的IplImage*指针对象进行内存释放时,出现了代码的堆叠,为此我们可以通过每个独立阶段释放内存来简化上面这
9d4d
个程序:
对于自清理方法的一个提醒:在Opencv中,我们必须确认被释放的空间是我们显式分配的。例如前面从cvQueryFrame()返回的IplImage*指针,对于这个指针用cvReleaseImage函数释放会产生许多难以处理的问题。
说明:虽然内存垃圾处理在Opencv中很重要,但我们只需要释放自己的显式分配的内存空间。
#include <cv.h> #include <highgui.h> #include<iostream> using namespace std; void example2_4(IplImage* image) { //Create some windows to show the input //and output images in. // cvNamedWindow("Example4-in"); cvNamedWindow("Example4-out"); //Create a window to show our input image // cvShowImage("Example4-in", image); //Create an image to hold the smoothed output //cvCreateImage为创建图像的函数 // IplImage* out = cvCreateImage( cvGetSize(image), //当前图像结构的大小 IPL_DEPTH_8U, //每个像素点的数据类型 3 //通道数 ); //Do the smoothing //cvSmooth为平滑处理函数 // cvSmooth(image, out, CV_GAUSSIAN, 3, 3); //参数分别表示:输入图像,输出图像,平滑处理的方法,平滑处理的相关参数 //此处最后两个参数表示使用每个像素周围3*3的区域进行高斯平滑处理 //show the smoothed image in the output window // cvShowImage("Example4-out", out); //be tidy // cvReleaseImage(&out); //wait for the user to hit a key,then clean up the windows // cvWaitKey(0); cvDestroyWindow("Example4-in"); cvDestroyWindow("Example4-out"); } int main() { IplImage* img = cvLoadImage("Example1.jpg"); example2_4(img); cvReleaseImage(&img); }
一个复杂一点的变换:
(1)对图像尺寸进行变换
#include <cv.h> #include <highgui.h> #include<iostream> using namespace std; IplImage* doPyrDowm(IplImage* in, int filter = CV_GAUSSIAN_5x5) // CV_GAUSSIAN_5x5在书中为IPL_GAUSSIAN_5x5,但IPL_GAUSSIAN_5x5不在库中 { //best to make sure input image is divisible by two. // //assert(in->width % 2 != 0 && in->height % 2 == 0); //条件正确继续进行,错误则终止程序,根据资料此函数不常用 //若将in->width % 2 != 0改为in->width % 2 == 0,不可运行 //思考后得出:可能是因为老版本对尺寸要求比较严格,3.0版opencv无尺寸问题 IplImage* out = cvCreateImage( CvSize(in->width / 2, in->height / 2), //大小只有输入图像1/4的图像 in->depth, //输入图像每个像素点的数据类型 in->nChannels); //输入图像的通道数 cvPyrDown(in, out); return(out); } int main() { IplImage* img1 = cvLoadImage("Example1.jpg"); IplImage* img = doPyrDowm(img1, CV_GAUSSIAN_5x5); cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE); cvShowImage("Example1", img); cvWaitKey(0); cvReleaseImage(&img); cvReleaseImage(&img1); cvDestroyWindow("Example1"); }
cvPyrDown为openCV中的一个函数。
功能:
函数cvPyrDown使用Gaussian金字塔分解对输入图像向下采样。
格式:
void cvPyrDown(const CvArr*src,CvArr*dst,int filter=CV_GAUSSIAN_5x5);
参数:
src 输入图像。
dst 输出图像,其宽度和高度应是输入图像的一半。
filter 卷积滤波器类型,目前仅支持CV_GAUSSIAN_5x5。
//函数资料来自百度百科
(2)Canny边缘检测将输出写入一个单通道(灰度级)图像
#include <cv.h> #include <highgui.h> #include<iostream> using namespace std; IplImage* doCanny(IplImage* in, double lowThresh, double highThresh, double aperture) { if (in->nChannels != 1) //确保输入图像为灰度图像 return(0); IplImage* out = cvCreateImage( CvSize(cvGetSize(in)), //cvGetSize函数提取输入函数的图像大小 IPL_DEPTH_8U, //IPL_DEPTH_8U表示图像像素类型:无符号8位整数 1); //单通道(灰度级) cvCanny(in, out, lowThresh, highThresh, aperture); //见下方函数说明 return(out); } int main() { IplImage* img1 = cvLoadImage("Example1.jpg",0); IplImage* img = doCanny(img1, 10, 100, 3); cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE); cvNamedWindow("Example2", CV_WINDOW_AUTOSIZE); cvShowImage("Example1", img1); cvShowImage("Example2", img); cvWaitKey(0); cvReleaseImage(&img1); cvReleaseImage(&img); cvDestroyWindow("Example1"); cvDestroyWindow("Example2"); }
cvCanny为openCV中的一个函数。
功能:
用于对图像的边缘检测(采用canny算法)。
格式:
void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int aperture_size=3
);
参数:
image 输入单通道图像(可以是彩色图像)对于多通道的图像可以用cvCvtColor()修改。
edges 输出的边缘图像 ,也是单通道的,但是是黑白的
threshold1 第一个阈值
threshold2 第二个阈值
aperture_size Sobel 算子内核大小(可为3,5,7三个数值)
函数 cvCanny 采用 Canny 算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。
//函数资料来自百度百科
[b](3)连续进行两次缩放处理与Canny边缘检测[/b]
#include <cv.h> #include <highgui.h> #include<iostream> using namespace std; IplImage* doPyrDowm(IplImage* in, int filter = CV_GAUSSIAN_5x5) // CV_GAUSSIAN_5x5在书中为IPL_GAUSSIAN_5x5,但IPL_GAUSSIAN_5x5不在库中 { //best to make sure input image is divisible by two. // //assert(in->width % 2 != 0 && in->height % 2 == 0); //条件正确继续进行,错误则终止程序,根据资料此函数不常用 //若将in->width % 2 != 0改为in->width % 2 == 0,不可运行 //思考后得出:可能是因为老版本对尺寸要求比较严格,3.0版opencv无尺寸问题 IplImage* out = cvCreateImage( CvSize(in->width / 2, in->height / 2), //大小只有输入图像1/4的图像 in->depth, //输入图像每个像素点的数据类型 in->nChannels); //输入图像的通道数 cvPyrDown(in, out); return(out); } IplImage* doCanny(IplImage* in, double lowThresh, double highThresh, double aperture) { if (in->nChannels != 1) //确保输入图像为灰度图像 return(0); IplImage* out = cvCreateImage( CvSize(cvGetSize(in)), //cvGetSize函数提取输入函数的图像大小 IPL_DEPTH_8U, //IPL_DEPTH_8U表示图像像素类型:无符号8位整数 1); //单通道(灰度级) cvCanny(in, out, lowThresh, highThresh, aperture); return(out); } int main() { IplImage* img = cvLoadImage("Example1.jpg", 0); IplImage* img1 = doPyrDowm(img, CV_GAUSSIAN_5x5); IplImage* img2 = doPyrDowm(img1, CV_GAUSSIAN_5x5); IplImage* img3 = doCanny(img2, 10, 100, 3); cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE); cvShowImage("Example1", img); cvNamedWindow("Example2", CV_WINDOW_AUTOSIZE); cvShowImage("Example2", img1); cvNamedWindow("Example3", CV_WINDOW_AUTOSIZE); cvShowImage("Example3", img2); cvNamedWindow("Example4", CV_WINDOW_AUTOSIZE); cvShowImage("Example4", img3); cvWaitKey(0); cvReleaseImage(&img); cvReleaseImage(&img1); cvReleaseImage(&img2); cvReleaseImage(&img3); cvDestroyWindow("Example1"); cvDestroyWindow("Example2"); cvDestroyWindow("Example3"); cvDestroyWindow("Example4"); }
在上面的这个程序中,我们不难发现,在最后对不同的IplImage*指针对象进行内存释放时,出现了代码的堆叠,为此我们可以通过每个独立阶段释放内存来简化上面这
9d4d
个程序:
int main() { IplImage* img = cvLoadImage("Example1.jpg", 0); IplImage* out; cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE); cvShowImage("Example1", img); cvNamedWindow("Example2", CV_WINDOW_AUTOSIZE); out = doPyrDowm(img, CV_GAUSSIAN_5x5); out = doPyrDowm(out, CV_GAUSSIAN_5x5); out = doCanny(out, 10, 100, 3); cvShowImage("Example2", out);<span style="white-space:pre"> //直接显示最后效果 cvWaitKey(0); cvReleaseImage(&img); cvReleaseImage(&out); cvDestroyWindow("Example1"); cvDestroyWindow("Example2"); }
对于自清理方法的一个提醒:在Opencv中,我们必须确认被释放的空间是我们显式分配的。例如前面从cvQueryFrame()返回的IplImage*指针,对于这个指针用cvReleaseImage函数释放会产生许多难以处理的问题。
说明:虽然内存垃圾处理在Opencv中很重要,但我们只需要释放自己的显式分配的内存空间。
相关文章推荐
- OpenCV学习笔记(12)OpenCV调用Matlab函数进行保存视频的尝试
- OpenCV学习笔记-霍夫线变换2
- 【opencv学习笔记4】视频流的帧图像变换
- 第三篇 学习OpenCV之图像变换(2)
- 第三篇 学习OpenCV之图像变换(2)
- OpenCV学习——Laplace变换(视频边界检测)
- OpenCV 学习(Hough 变换提取直线)
- OpenCV学习笔记【5】:一个复杂的变换
- OpenCV学习笔记【4】:一个简单的变换
- 第三篇 学习OpenCV之图像变换(3)
- OpenCV学习笔记-霍夫圆变换
- opencv学习心得五----图像变化(灰度变换、二值变换)
- 【学习opencv第五篇】霍夫线变换
- OpenCV学习(六)之图像缩放变换
- Opencv学习笔记(三):图像的使用与操作_颜色空间的变换
- OpenCV学习笔记-霍夫线变换1
- 学习opencv之Hough变换
- 学习OpenCV(四) 改变图像的对比度和亮度——像素变换
- 第三篇 学习OpenCV之图像变换(1)
- Opencv学习手册(四)--- 图像灰度变换