由于专业方向,最近开始学习opencv,打算以《学习opencv》一书为纲,一周学习一章至两章,特此记录。
版本信息 ubuntu 14.04 + QT 5.7.1 +opencv3.1
加载图像并显示
QT中貌似不能在CMakeLists.txt自动添加opencv的链接指令,所以我们手动添加一下:
cmake_minimum_required(VERSION 2.8)
project(readAImage)
add_executable(${PROJECT_NAME} "main.cpp")
# 寻找OpenCV库
find_package( OpenCV 3 REQUIRED )
# 添加头文件
include_directories( ${OpenCV_INCLUDE_DIRS} )
# 链接OpenCV库
target_link_libraries( readAImage ${OpenCV_LIBS} )
下面是主程序:
#include <iostream>
// *暂时理解highgui是一个包含诸多与用户交互的窗口类(GUI)的头文件.
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main(int argc, char *argv[])
{
Mat image = imread(argv[1],-1);//使用imread函数把参数读入到一个Mat对象中,-1是一个异常值
if(image.empty()) return -1;
namedWindow("ImageWindow",cv::WINDOW_AUTOSIZE);//定义窗口类对象
imshow("ImageWindow",image);在窗口中显示图片对象
waitKey(0);
destroyWindow("ImageWindow");//销毁窗口
return 0;
}
加载一个视频文件
程序思路是:
创建一个窗口用来显示视频 namedWindow (事实上是显示捕捉到的视频帧)
创建一个视频捕捉对象 Videocap,并用他打开视频文件
使用一个循环不断输出cap对象中的帧(frame)
int main(int argc, char *argv[])
{
cv::namedWindow("Example3",cv::WINDOW_AUTOSIZE);
//creat a video class using VideoCapture
cv::VideoCapture cap;
cap.open(string(argv[1]));
cv::Mat frame;
for(;;){
cap >> frame;//将VideoCapture类对象cap中的帧不断输出
if (frame.empty()) break;//如果未读出,则推出循环
cv::imshow("Example3",frame);
if(cv::waitKey(33) >= 0) break;//在frame与frame之间会间隔33毫秒,如果在这期间没有中断操作,则cap继续捕捉桢数
}
return 0;
}
- 关于waitKey函数
waitKey函数的会返回一个整数值,这个值是用户输入的键盘值的ascii码,通常用来处理在一个循环中,如果用户键入一个特定值,便引发特定操作.因此,if(cv::waitKey(33) >= 0) break;表示如果用户键入了任何一个值,则引发break.