数字图像处理实验教程 V3.1
依次打开Tools->Options->Directories: 在Library files中,添加如下目录: (三)配置项目
要使得VC6.0项目能够支持OpenCV,需要在项目中添加
OpenCV的库文件链接,使程序能够知道所用的函数是来自哪个库。 依次打开Project->Settings->Link,在Object/library modules中,添加所需要的lib文件,以空格分开。通常包括(6个):
cxcore.lib cv.lib cvaux.lib highgui.lib cvcam.lib ml.lib
(4) 如何修改程序,使得程序可以显示多幅图像? 5. 练习
【基础练习】试着不用参考给定例程,自己写出本次实验的代码,掌握OpenCV图像处理程序的基本流程和框架。
【扩展练习】编程实现加载并显示三幅图像,其中一幅通过指定文件名的方式读取,另外两幅通过外部输入参数读取。
1. #include
5. using namespace std; 6.
7. #pragma comment(lib, \ 8. #pragma comment(lib, \ 9. #pragma comment(lib, \ 10.
11. void imshowMany(const std::string& _winName, const vector
; 12.
13. int main(void) 14. {
15. std::vector
23. imshowMany(\, imgs); 24. cvWaitKey(); 25.
6
数字图像处理实验教程 V3.1
26. return 0; 27. } 28.
29. void imshowMany(const std::string& _winName, const vector
30. {
31. int nImg = (int)_imgs.size(); 32.
33. IplImage* dispImg; 34.
35. int size; 36. int x, y; 37.
38. // w - Maximum number of images in a row 39. // h - Maximum number of images in a column 40. int w, h;
41. // scale - How much we have to resize the image 42. float scale; 43. int max; 44.
45. if (nImg <= 0) 46. {
47. printf(\); 48. return; 49. }
50. else if (nImg > 12) 51. {
52. printf(\); 53. return; 54. } 55.
56. else if (nImg == 1) 57. {
58. w = h = 1; 59. size = 300; 60. }
61. else if (nImg == 2) 62. {
63. w = 2; h = 1; 64. size = 300; 65. }
66. else if (nImg == 3 || nImg == 4) 67. {
68. w = 2; h = 2;
7
数字图像处理实验教程 V3.1
69. size = 300; 70. }
71. else if (nImg == 5 || nImg == 6) 72. {
73. w = 3; h = 2; 74. size = 200; 75. }
76. else if (nImg == 7 || nImg == 8) 77. {
78. w = 4; h = 2; 79. size = 200; 80. } 81. else 82. {
83. w = 4; h = 3; 84. size = 150; 85. } 86.
87. dispImg = cvCreateImage(cvSize(100 + size*w, 60 + size*h), IPL_DEPTH_8U,
3); 88.
89. for (int i= 0, m=20, n=20; i 91. x = _imgs[i]->height; 92. y = _imgs[i]->width; 93. 94. max = (x > y)? x: y; 95. scale = (float) ( (float) max / size ); 96. 97. if (i%w==0 && m!=20) 98. { 99. m = 20; 100. n += 20+size; 101. } 102. cvSetImageROI(dispImg,cvRect(m, n, (int)(x/scale), (int)(y/scale))) ; 103. cvResize(_imgs[i], dispImg); 104. cvResetImageROI(dispImg); 105. } 106. 107. cvNamedWindow(_winName.c_str()); 108. cvShowImage(_winName.c_str(), dispImg); 109. } 8 数字图像处理实验教程 V3.1 6. 实验报告要求 实验报告要求写明以下7方面内容: (1) 写明实验目的。 (2) 写明实验内容和步骤。 (3) 写出完整的控制台程序代码,并加详细的注释。(仅对hello.c) (4) 描绘并解释实验结果,并对实验结果进行分析。 (5) 写明实验中存在的不足,以及改进的方法。 (6) 回答实验中涉及到的问题。 (7) 写出本次实验的体会。 7. 预习内容 (1)如何用摄像头采集图像并进行显示? (2)OpenCV功能的进一步了解。 8. 参考程序代码 /* 程序名:hello.cpp 功 能:读入指定文件,并在屏幕上显示 */ #include \ #include \ #define FILENAME \使用宏定义,指定图像文件名 void main() { IplImage* pImg;//定义图像结构变量指针 pImg=cvLoadImage(FILENAME,1);//加载指定文件 cvNamedWindow(\创建窗口,第2个参数为1表示固定大小,0表示可变大小 cvShowImage(\在指定窗口显示图像文件 cvWaitKey(0);//等待按键,若无此句,程序运行时看不到结果 cvDestroyWindow(\销毁窗口 cvReleaseImage(&pImg);//释放图像文件 } /* 程序名:hello2.cpp 功 能:从磁盘中读入任意图像文件,并将图像显示在屏幕上 */ #include \ #include \ //在main函数中,argc表示主程序接收的参数个数,argv数组接收程序参数 //如:当argc=2时,argv[0]表示第0个参数(可执行程序本身),argv[1]表示第1个参数(需人为输入) 9 数字图像处理实验教程 V3.1 //当argc=1时,表示不需要从外界接收参数 int main(int argc, char** argv) { IplImage* pImg;//声明IplImage指针 //载入图像 if (argc==2 改为1&& (pImg=cvLoadImage(argv[1],1))!=0) { cvNamedWindow(\创建窗口 cvShowImage(\显示图像 cvWaitKey(0);//等待按键 cvDestroyWindow(\销毁窗口 cvReleaseImage(&pImg);//释放图像 return 0; } return -1; } 9. OpenCV函数解释 OpenCV的函数和数据类型命名规则如下: (1) 宏全部使用大写字符,字间用下划线分隔,如:CV_MAX_DIM, IPL_DEPTH_32F。 (2) 数据类型以Cv开头,如:CvSize,CvPoint3D64f等。 (3) 函数以cv开头,如:cvLoadImage、cvSaveImage等。 需要包含的OpenCV头文件: \:OpenCV的基本函数头文件。 \:用于用户GUI界面设计的OpenCV专用库,包括很多Windows API接口函数。 OpenCV基本函数: cvLoadImage从文件读取图像 语法:IplImage* cvLoadImage(const char* filename,int flag=1) 参数: filename:待载入的文件名,包括扩展名。可以载入BMP,DIB,JPEG,PNG,PBM,PGM,PPM,SR,RAS和TIFF等文件格式。 flag表示是否是彩色图像(多通道),默认为1,表示读入的图像被强制为3通道的彩色图像 flag=0,表示载入图像强制为单通道灰度图像 flag<0,表示载入图像由文件中的图像通道数决定。 返回值为IplImage结构指针。 10