平台:32位Win7操作系统+VS2012+OpenCv2.4.4
实验目的:通常我们可以应用某种方式变换,用输出来覆盖输入变量,但是这并不是总是行得通的。具体来说,有些操作输出的图像比输入的图像相比,大小/深度/通道数目都不一样。
故,我们希望对一些原始图像进行一系列操作并且产生一系列变换后的图像。在Opencv中有几个封装好的函数很有用,这些函数既包含输出图像内存空间分配,同时也进行
了一些我们感兴趣的变换。缩放处理常通过cvPyrDown()函数来完成。
实验内容:1.对原RGB图像进行灰度处理;
2.利用cvPyrDown()创建一幅高度宽度均为输入图像一半尺寸的图像;
3.利用Canny边缘检测输出一个单通道(灰度级)图像。
过程中问题描述:
1)编译报错
错误 1 error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. d:\opencv2.4.4\opencv\build\include\opencv2\flann\logger.h 66 1 ImageTransform
不知道是什么原因图像也输不出来。我只写了简单的输出图像程序还是报错。奇怪了,我之前写的时候怎么没有报错???还是我处理了我不记得了???操作步骤::属性管理器——>Microsoft.Cpp.Win32.user(点击右键,属性)——>C/C++——>预处理器——>添加了一下几项(WIN32,_DEBUG,_CONSOLE,_CRT_SECURE_NO_WARNINGS).
实现代码:
1. #include "stdafx.h"
2. #include "cv.h"
3. #include <cxcore.h>
4. #include <highgui.h>
5.
6.
7.
8. //第一个函数:缩放处理函数
9. IplImage*doPyrDown(IplImage*in,int filter=IPL_GAUSSIAN_5x5){
10. (in->width%2==0 && in->height%2==0);//确认长宽像素是偶数(否则无法缩放一半)
11. * out=cvCreateImage(
12. (in->width/2,in->height/2),
13. in->depth,
14. in->nChannels
15. );//创建新图像,长宽各一半,同深度,同通道数
16. (in,out);
17. (out);
18. };
19.
20. //第二个函数:Canny边缘检测
21. IplImage* doCanny(IplImage* in,double lowThresh,double highThresh,double aperture){
22. if(in->nChannels!=1)
23. (0);//Canny只能处理灰度图
24.
25. * out = cvCreateImage(
26. ( in ),
27. in->depth, //IPL_DEPTH_8U,
28. );
29. ( in, out, lowThresh, highThresh, aperture );
30. //函数的第二及第三个参数为两个阈值。小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割
31. ( out );
32. };
33.
34.
35.
36.
37. int main( int argc, char** argv ){
38.
39.
40. ("Example RGB", CV_WINDOW_AUTOSIZE );
41. ("Example Gray", CV_WINDOW_AUTOSIZE );
42. ("Example Pyr", CV_WINDOW_AUTOSIZE );
43. ("Example Canny", CV_WINDOW_AUTOSIZE );
44.
45. * img_rgb = cvLoadImage("cube.jpg");//载入原RBG图
46. * out;
47.
48. ("Example RGB",img_rgb );//显示原RBG图
49.
50. = cvCreateImage( cvSize( img_rgb->width,img_rgb->height ), img_rgb->depth, 1);
51. (img_rgb, out ,CV_BGR2GRAY);//把载入图像转换为灰度图
52. ("Example Gray", out );//显示灰度图
53.
54. = doPyrDown( out );
55. = doPyrDown( out );//执行两次缩小处理
56. ("Example Pyr", out );//显示缩小图
57.
58. = doCanny( out, 10, 100, 3 );//进行Canny边缘检测
59. ("Example Canny", out );//显示canny边缘检测图
60.
61. cvWaitKey(0);
62. cvReleaseImage( &out);//通过每个独立独立阶段处理图像,简化了流程
63.
64. cvDestroyWindow("Example Gray");
65. cvDestroyWindow("Example Pyr");
66. cvDestroyWindow("Example Canny");
67. }
实现结果:(注,此处使用的http://blog.chinaunix.net/uid-26673820-id-3066244.html代码和粘贴的图片)