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

  • 相关阅读:
    刷题总结——table(ssoi)
    算法复习——差分约束(ssoi种树)
    刷题总结——谈笑风生(主席树+dfs序的应用)
    刷题总结——序列操作(权值线段树套树状数组)
    刷题总结——shortest(ssoi)
    算法总结——主席树(poj2104)
    刷题总结——路径(ssoi)
    刷题总结——鸭舌(ssoi)
    刷题总结——电影(ssoi)
    刷题总结——随机图(ssoi)
  • 原文地址:https://www.cnblogs.com/happyamyhope/p/8474850.html
Copyright © 2020-2023  润新知