2017.04.22
编程环境:
- Linux Ubuntu 14.04
- OpenCV 3.2.0
- Qt 5.8.0
注:虽然是opencv3环境,但由于手头资料用的是OpenCV2,所以仍然是opencv2的编程风格,资料下载地址:
http://linux.linuxidc.com/index.php?folder=cHViLzIwMTEvMDgvMDQ=
main.cpp代码:
#include "highgui.h"
using namespace cv;
int main(int argc, char* argv[])
{
//argc表示命令行的输入参数个数,argv[]表示参数数组,argv[0]指向程序本身,argv[1]指向第一个参数
//cvLoadImage(argv[1])从argc[1]指向的图片路径载入图片
IplImage* img = cvLoadImage(argv[1]);
//cvNamdWindow()创建一个显示图片的窗口,窗口标题为"showImg",CV_WINDOW_AUTOSIZE表示窗口大小自适应图片大小
cvNamedWindow("showImg",CV_WINDOW_AUTOSIZE);
//cvShowImage()表示在窗口"showImg"中显示图片
cvShowImage("showImg",img);
//cvWaitKey(int delay=0)表示等待按键输入
cvWaitKey(0);
//cvReleaseImage(&img)释放图片内存
cvReleaseImage(&img);
//cvDestroyWindow("showImg")表示释放窗口内存
cvDestroyWindow("showImg");
}
编译文件有两种方式:
1. 在文件目录下编写build.sh脚本
#!/bin/bash
gcc main.cpp -o test_01_show_img `pkg-config --cflags --libs opencv`
上述脚本命令表示用gcc编译main.cpp,输出可执行文件test_01_show_img(可以自己命名),后面反引号表示将反引号中的命令结果作为参数传给之前的命令gcc,pkg-config --cflags --libs opencv
表示链接到opencv库
- 在终端下进入目录,执行:
sudo chmod u+x build.sh
//修改文件执行权限 - 终端下输入:
./build.sh
//通过脚本编译文件 - 终端下输入 :
./test_01_show_img ~/图片/00000.jpg
//执行程序,显示~/图片
目录下的00000.jpg
图片
2.cmake方式
- 将opencv的安装目录下
opencv-3.2.0/samples/cpp/example_cmake
的CMakeLists.txt文件copy到工程目录下
cp CMakeLists.txt ~/MyDemo/Opencv/test_01_show_img
- 修改CMakeLists.txt:
project(opencv_example_project)
–>project(test_01_show_img)
add_executable(opencv_example example.cpp)
–>add_executable(test_01_show_img main.cpp)
target_link_libraries(opencv_example ${OpenCV_LIBS})
–>
target_link_libraries(test_01_show_img ${OpenCV_LIBS})
- 在终端下进入到工程目录
cd ~/MyDemo/Opencv/test_01_show_img
- 执行:
cmake ./
//生成makefile文件 - 执行:
make
- 执行:
./test_01_show_img ~/图片/00000.jpg
Notice:
1. 如果是在Qt中创建工程,并希望在Qt环境里编译运行,那么需要在.pro文件中添加下列代码,INCLUDEPATH表示文件路径,LIBS表示所用库的链接文件,与windows系统下的.dll文件类似。
INCLUDEPATH += /usr/local/include \
/usr/local/include/opencv \
/usr/local/include/opencv2
LIBS += /usr/local/lib/libopencv_highgui.so
2. cvWaitKey()函数的功能是使程序暂停,并等待用户出发按键操作。
- 参数默认值为0,如果参数是一个正数num,则程序将暂停一段时间,单位是num 毫秒。
- 如果参数是0或者负数,程序将一直等待用户触发按键操作。
- 返回值为按键的ASCII码,如ESC键返回值为27
因此可以使程序循环执行下列代码,当用户按键ESC时退出循环
while(!stop) { ...//循环执行的操作 char c = cvWaitkey(time); //暂停time ms if(c == 27) stop = true; ... }