camera按键采集图像及waitKey的用法

前言html

项目须要经过摄像头采集图像并保存,主要是用于后续的摄像头标定。实现过程其实很简单,须要注意一些细节。linux

系统环境ios

系统版本:ubuntu16.04;opencv版本:opencv2.4.13;编程语言:c++;c++

实现过程编程

/************************************************************************ * Copyright(c) 2018 * All rights reserved. * File: capture_image.cpp * Brief: capture and save image. * Version: 1.0 * Author: * Email: * Date: 2018/02/24 * History: ************************************************************************/ #include <iostream> #include <opencv2/highgui/highgui.hpp> #include <fstream>

using namespace std; using namespace cv; // int capture_image() { VideoCapture capture(0); if ( !capture.isOpened()) { std::cout << "capture camera error! " << std::endl; } cv::namedWindow("capture frame", CV_WINDOW_NORMAL); std::cout << "按C保存当前帧...\n按Q退出取帧过程...\n" << std::endl; Mat frame; int count = 0; char filename[64]; while (true) { capture >> frame; if (frame.empty()) { break; } cv::imshow("capture frame", frame); if ( (char)waitKey(10) == 'C') { count++; //filename = "calib" + to_string(count) + ".jpg";
            sprintf(filename, "./calib%03d.jpg", count); cout << filename << endl; imwrite(filename, frame); std::cout << "成功获取当前帧,并以文件名" << filename << "保存..." << std::endl; std::cout << "按C保存当前帧...\n按Q退出取帧过程...\n" << std::endl; } else if ((char)waitKey(1) == 'Q') { std::cout << "完成图像的获取保存..." << std::endl; std::cout << "共保存" << count << "帧图像..." << std::endl; break; } } capture.release(); //释放对象
    return 0; } //主程序入口
int main() { capture_image(); return 0; }
View Code

内容介绍ubuntu

1.waitKey的用法;windows

C++: int waitKey(int delay=0)

1.1 函数功能:不断刷新图像,频率为delay,单位为毫秒(ms),返回值为当前键盘的按键值;app

1.2 等待delay>0毫秒,若是在此期间有按键按下,则当即结束并返回按下按键的ASCII码,不然返回值为-1;若delay=0毫秒,则无限等待下去,直到有按键按下为止;jsp

1.3 waitKey仅仅对窗口机制起做用,即nameWindow或者imshow产生的窗口;编程语言

1.4 注意,waitKey返回值是int类型的;

2.格式转换;

若是waitKey函数不进行数据格式转换为char类型,则该程序在VS中能够正常运行,可是在linux系统不能运行,主要是因为数据格式的问题。

int key = waitKey(10);//linux系统按下C键返回值为1179715.
char key = (char)waitKey(10);//linux系统按下C键返回值为C.

第一行语句在windows系统程序能够正常运行,而在linux系统不能正常运行,返回值为1179715(暂时还没搞清楚为何是这个数字);

第二行语句在linux系统下的返回值为字母C;

另外,调试过程当中若是没有获得理想的结果,多是哪一个环节出现问题,此程序就是键盘输入的结果与实际想要获得的结果(好比按键C与字母C)不一致形成的,须要进一步查看键盘输入的结果是什么,是否和预期同样。

3. linux系统下使用CmakeLists.txt进行编译连接;

#cmake needs this line #TX2 cmake_minimum_required(VERSION 2.8) project(capture_image)#工程名字 find_package(OpenCV REQUIRED)#查找相关配置文件 message(STATUS "OpenCV library status:")#打印信息,能够屏蔽掉 message(STATUS " version: ${OpenCV_VERSION}") message(STATUS " libraries: ${OpenCV_LIBS}") #message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}") include_directories(${OpenCV_INCLUDE_DIRS}) add_executable(capture_image capture_image.cpp)#生成的可执行文件的名字 与 源代码文件 target_link_libraries(capture_image ${OpenCV_LIBS})#与你的工程同名 #PC #CMAKE_MINIMUM_REQUIRED(VERSION 2.8) #PROJECT(capture_image) #SET(OpenCV_DIR /lib/opencv2413/opencv-2.4.13.4/build) #INCLUDE_DIRECTORIES(/lib/opencv2413/opencv-2.4.13.4/build/include) #FIND_PACKAGE(OpenCV REQUIRED) #ADD_EXECUTABLE(capture_image capture_image.cpp) #TARGET_LINK_LIBRARIES(capture_image ${OpenCV_LIBS}) #MESSAGE(STATUS "OpenCV_LIBS: ${OpenCV_LIBS}")
View Code

注意,添加工程所在系统所须要的包及其库目录和包含目录(好比FIND_PACKAGE/INCLUDE_DIRECTORIES/SET(OpenCV_DIR /lib/opencv2413/opencv-2.4.13.4/build)等);

有时间会详细介绍一下CMakeLists.txt和MakeFile文件的编写规则,先立个flag!!!

4.to_string函数;

这个函数以前有介绍过here,to_string函数是c++11标准中的函数,须要用到头文件

#include <string>

其中一个博客中介绍须要添加-std=c++11(博客后来没找到),可是在linux系统中运行程序如何添加使用-std=c++11,从而依据c++11标准运行的方法还不甚了解,明白的朋友能够私信或者留言,先谢过啦!

5.sprintf函数;

sprintf函数的头文件是

#include <fstream>

参考

1.waitKey用法

2.格式问题解决方法

3.opencv单目摄像机标定