前言

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

系统环境

系统版本: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();
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 = ;
char filename[];
while (true)
{
capture >> frame;
if (frame.empty()) { break; }
cv::imshow("capture frame", frame); if ( (char)waitKey() == '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() == 'Q')
{
std::cout << "完成图像的获取保存..." << std::endl;
std::cout << "共保存" << count << "帧图像..." << std::endl;
break;
}
}
capture.release(); //释放对象
return ;
} //主程序入口
int main()
{
capture_image();
return ;
}

内容介绍

1.waitKey的用法;

C++: int waitKey(int delay=)

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();//linux系统按下C键返回值为1179715.
char key = (char)waitKey();//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}")

注意,添加工程所在系统所需要的包及其库目录和包含目录(比如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单目摄像机标定

camera按键采集图像及waitKey的用法的更多相关文章

  1. camera按键采集图像及waitKey的用法(转)

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

  2. Camera 采集图像的方法

    使用 Camera 采集图像, 实现步骤如下: 需要权限: android.permission.CAMERA android.permission.WRITE_EXTERNAL_STORAGE // ...

  3. Halcon WPF C#采集图像区域灰度值

    源码下载地址:https://github.com/lizhiqiang0204/ImageGray.git Halcon代码如下: *读取图片,转换成灰度图片 read_image (Image1, ...

  4. vs联合halcon——采集图像(实时采集与单次采集)

    摘要 在对vs进行环境配置好以后,就可以开始与halcon联合进行实战.本篇就对图像的采集进行总结.通过构建采集相机GrabImage类的三个方法实现图像的采集: open() 打开相机 grabim ...

  5. Android 音视频开发(四):使用 Camera API 采集视频数据

    本文主要将的是:使用 Camera API 采集视频数据并保存到文件,分别使用 SurfaceView.TextureView 来预览 Camera 数据,取到 NV21 的数据回调. 注: 需要权限 ...

  6. Halcon采集图像Image Acquisition解析

    很明显,图像的采集是所有机器视觉应用中必须解决的问题,HALCON提供了为各种图像采集设备执行这种交互的接口,图像采集的任务被简化为几行代码,只需几个操作符的调用,更重要的是,这种简单并不是以限制可用 ...

  7. Jetson TX1使用usb camera采集图像 (2)

    该方法只启动usb摄像头 import cv2 import numpy import matplotlib.pyplot as plot class Camera: cap = cv2.VideoC ...

  8. Jetson TX1使用usb camera采集图像 (1)

    使用python实现 https://jkjung-avt.github.io/tx2-camera-with-python/ How to Capture and Display Camera Vi ...

  9. Android Camera 预览图像被拉伸变形的解决方法【转】

    问题描述: 预览图像被拉伸变形 问题原因: 由于预览图像大小跟SurfaceView 大小不一致引起 解决方法: 获取系统支持的所有预览尺寸[getSupportedPictureSizes],然后再 ...

随机推荐

  1. 使用python语言操作MongoDB

    MongoDB是一个跨平台的NoSQL,基于Key-Value形式保存数据.其储存格式非常类似于Python的字典,因此用Python操作MongoDB会非常的容易. pymongo的两种安装命令 p ...

  2. 记H5单页遇到的几个ios兼容问题

    最近写一个H5活动页,安卓里的表现很不错,写下来很少出现兼容性问题,ios就不一样了,好多问题都出现在ios上(手动狗头)

  3. WCF的简单使用

    WCF简单介绍 WCF(windows communication foundation)是微软推出的数据通信的统一编程模型,在WCF有四个主要的关键点: abcd Address(地址):定义服务的 ...

  4. Python面向对象之成员修饰符

    对于这些类成员有修饰符 之前定义字段country任何对象都可以访问,是公有的 可以定义为私用属性,只有类内部的方法可以调用,外部不能直接调用,但是可以间接调用 vim day7-10.py #!/u ...

  5. nowcoder2018年全国多校算法寒假训练营练习比赛(第一场)

    [气死我了 写完了博客发布 点看来一看怎么只剩下一半不到的内容了!!!!!!!!!!] [就把卡的那两道放上来好了 其余的不弄了 生气!!!!!] 可以说是很久没有打比赛了 今天这一场主要是  基础算 ...

  6. codeforces 355C - Vasya and Robot

    因为在允许的情况下,必然是左右手交替进行,这样不会增加多余的无谓的能量. 然后根据不同的分界点,肯定会产生左手或右手重复使用的情况,这是就要加上Qr/Ql * 次数. 一开始的想法,很直接,枚举每个分 ...

  7. XTU 1264 - Partial Sum - [2017湘潭邀请赛E题(江苏省赛)]

    2017江苏省赛的E题,当时在场上看错了题目没做出来,现在补一下…… 题目链接:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id ...

  8. 修改mac地址(物理地址)

    查询原有的MAC地址(物理地址) cmd ipconfig /all 修改MAC地址(物理地址) 修改MAC地址后,再查看MAC地址: cmd ipconfig /all 修改成功.

  9. SSH进行登录远程主机,实验室网站,项目

    1:下载putty,双击putty.exe     http://www.putty.be/latest.html 输入要连接的ip和端口号,直接打开open.或者在saved Sessions框里面 ...

  10. 项目发布脚本-go

    #!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin clear printf &q ...