zoukankan      html  css  js  c++  java
  • camera按键采集图像及waitKey的用法

    前言

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

    系统环境

    系统版本:ubuntu16.04;opencv版本:opencv2.4.13;编程语言: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保存当前帧...
    按Q退出取帧过程...
    " << 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保存当前帧...
    按Q退出取帧过程...
    " << 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

    内容介绍

    1.waitKey的用法;

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

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

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

    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单目摄像机标定

  • 相关阅读:
    KnockoutJS 3.X API 第五章 高级应用(4) 自定义处理逻辑
    KnockoutJS 3.X API 第五章 高级应用(3) 虚拟元素绑定
    KnockoutJS 3.X API 第五章 高级应用(2) 控制后代绑定
    KnockoutJS 3.X API 第五章 高级应用(1) 创建自定义绑定
    KnockoutJS 3.X API 第四章(14) 绑定语法细节
    KnockoutJS 3.X API 第四章(13) template绑定
    KnockoutJS 3.X API 第四章 表单绑定(12) selectedOptions、uniqueName绑定
    KnockoutJS 3.X API 第四章 表单绑定(11) options绑定
    KnockoutJS 3.X API 第四章 表单绑定(10) textInput、hasFocus、checked绑定
    KnockoutJS 3.X API 第四章 表单绑定(9) value绑定
  • 原文地址:https://www.cnblogs.com/happyamyhope/p/8474850.html
Copyright © 2011-2022 走看看