要求图像按照一定的编号序列命名,响应键盘指令:
Esc则退出程序;Enter/Space显示下一帧图像。
优先上框架代码。
- #include "stdafx.h"
- #include <iostream>
- #include <opencv2/opencv.hpp>
- using namespace std;
- using namespace cv;
- #define row 320
- #define col 640
- int _tmain(int argc, _TCHAR* argv[])
- {
- int nserial = 1; //< 序列变量
- int ntotal = 15; //< 序列总数
- const char* pcname; //< 指向文件名称的首地址
- string strnum; //< 序列变量寄存器
- string strname; //< 文件名称寄存器
- stringstream ss; //< 格式转换容器
- // 定义图像寄存器及图像路径
- Mat image;
- string strimg1 = "D:\\exam\\img_0000";
- string strimg2 = ".png";
- Mat dstimg(row, col, CV_8UC3, Scalar(0, 0, 0));
- namedWindow("Example", WINDOW_AUTOSIZE);
- imshow("Example", dstimg);
- // 采集键盘指令
- char ckey = waitKey(0);
- while(1)
- {
- // 按下Esc键则退出程序
- if(ckey == 27)
- {
- return 0;
- }
- // 按下回车或空格显示图像
- if(ckey == 13 || ckey == 32)
- {
- if (nserial > ntotal)
- {
- nserial = 1;
- }
- //int转换为string
- ss.clear();
- ss << nserial;
- ss >> strnum;
- // 序列变量位数变化时,修改名称string
- if ((nserial >=1)&(nserial <10))
- {
- strimg1 = "D:\\exam\\img_0000";
- }
- else if ((nserial >=10)&(nserial < 100))
- {
- strimg1 = "D:\\exam\\img_000";
- }
- // 图像路径名拼接
- strname = strimg1 + strnum + strimg2;
- pcname = strname.data();
- image = imread(pcname);
- // 更新显示区域
- imshow("Example", image);
- nserial++;
- }
- // 更新键盘指令
- ckey = waitKey(0);
- }// 显示图像while循环结束
- destroyWindow("Example");
- return 0;
- }
其中需要注意的地方有以下几点:
1、在复制图像文件的路径名称时要注意,有时候盘符名称之前会莫名其妙多出一个不可视的字符,就会造成找不到文件的情况。
2、代码中用到了stringstream类,将任意类型的变量传入给该类的对象后,再由该类的对象传出来,即可获得string类型的数据。既stringstream类用来完成对string类型的转换,如代码所示。
- //int转换为string
- ss.clear();
- ss << nserial;
- ss >> strnum;
其中的ss.clear()是为了清空ss对象,以便新的变量传入。
3、
int waitKey (int delay=0);
函数只在HgihGUI窗口被创建并活动的时候可用。
它的作用是等待delay毫秒的时间,在此时间内,如果键盘上某一个按键触发消息,则该函数传回这个按键的ASCII码。如果延时时间内没有按键消息被触发,则返回-1.
特殊的,当delay = 0的时候,无限期等待下去。