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保存當前幀...\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

內容介紹

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單目攝像機標定


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM