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

相關文章
相關標籤/搜索