【opencv的学习】各类变换的尝试
来源:互联网 发布:郑州软件培训机构 编辑:程序博客网 时间:2024/06/05 10:16
一个简单的变换:载入一副图像进行平滑处理
#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 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。
(3)连续进行两次缩放处理与Canny边缘检测
#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*指针对象进行内存释放时,出现了代码的堆叠,为此我们可以通过每个独立阶段释放内存来简化上面这个程序:
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中很重要,但我们只需要释放自己的显式分配的内存空间。
0 0
- 【opencv的学习】各类变换的尝试
- 【opencv的学习】ROI区域的初步尝试
- OpenCV学习笔记【4】:一个简单的变换
- OpenCV学习笔记【5】:一个复杂的变换
- 【opencv学习笔记4】视频流的帧图像变换
- 【OpenCV学习笔记 008】基于形态学运算的图像变换
- OpenCV学习之基于Hough变换的直线检测
- opencv入门学习之五:图像的对数变换
- Opencv学习---霍夫变换检测圆的基本原理
- opencv中的标准霍夫线变换HoughLines()的-学习笔记
- OpenCV学习笔记(12)OpenCV调用Matlab函数进行保存视频的尝试
- Hough变换(openCV的cvHoughLines2)
- Hough变换(openCV的cvHoughLines2)
- Hough变换(openCV的cvHoughLines2)
- Gabor变换的opencv实现
- opencv图像的形态学变换
- OpenCV 距离变换的笔记
- opencv 图像的几何变换
- android 之ListView
- 解决jdk1.8中发送邮件失败(handshake_failure)问题
- POJ 2195 Going Home [二分图带权匹配] [费用流]
- android studio导入项目报错Plugin with id 'com.android.application' not found.解决
- 如何使用drawerlayout
- 【opencv的学习】各类变换的尝试
- 对C#的exe更改图标
- ubuntu搭建Git服务器,windowns建立git客户端
- HDU 1864 CD报销发票+浮点数的01背包
- c语言课程设计:银行帐户管理系统
- 博弈论专题——推理与动态规划相关博弈之POJ2484 POJ1740(模仿游戏)
- mysql常用命令
- 7.OAut认证 根据授权码获取用户的ID,SECRET等信息
- 排序算法之折半插入排序的思想以及Java实现