目录html
注:原创不易,转载请务必注明原做者和出处,感谢支持!linux
本文的内容涉及了OpenCV 3.4.2在Ubuntu 16.04 LTS下的安装,OpenCV中图像的加载,显示,修改和保存等。ios
本文中涉及到的OpenCV API以下。这里只简要归纳API的功能,API详细用法请参阅权威的官方文档。c++
imread()用于读取图片文件,读取到的图片以Mat对象返回。filename为图片路径名。flags用于控制图片的读取。若是读取失败,Mat.empty()会返回true,Mat.data会被设置为NULL。ubuntu
namedWindow()用于建立window,建立的window能够用做图像(Mat对象)的placeholder。能够理解为window是用于盛放并显示图像的容器。winname是window的名字,winname会被imshow()方法引用。flags决定了window的类型,经常使用的取值为WINDOW_AUTOSIZE。api
imshow()用于显示图像。winname是盛放图像的window的名字,mat为图像对象。ide
cvtColor()用于转换图片的颜色空间(color space),好比经常使用的RGB颜色空间等。src为原图像,dst为转换后的图像,code表示颜色空间转换代码,好比COLOR_BGR2GRAY表示将RGB的彩色图转换成灰度图。测试
imwrite()用于将图像写入文件中。filename是文件名,img表示要被写入文件的Mat对象,params表示参数向量。spa
waitKey()用于等待按键按下事件。delay表示延迟的时间。c++11
关于OpenCV的安装请参考官方提供的文档:Installation in Linux。我尝试过在Ubuntu 16.04 LTS中编译安装最新的OpenCV 4.0版本,但在安装过程当中出现了严重的错误,没能成功安装。在我将版本降至3.4.2时才成功。
下面这个小实例用于测试OpenCV是否成功安装。之因此不一样时使用using namespace std
和using namespace cv
是由于OpenCV库中有一些外部名和C++ STL中的名字冲突。
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; int main(int argc, char *argv[]) { Mat src = imread("../images/lena.jpg", IMREAD_COLOR); if (src.empty()) { std::cout << "Could not load image..." << std::endl; return -1; } namedWindow("Test OpenCV Install", WINDOW_AUTOSIZE); imshow("Test OpenCV Install", src); waitKey(0); return 0; }
使用下列命令来编译上面的cpp文件。
g++ -g -Wall -std=c++11 Test-OpenCV-Install.cpp -o Test-OpenCV-Install `pkg-config --cflags --libs opencv`
若是一切无误,使用命令./Test-OpenCV-Install
运行可执行文件,能够看到以下图所示的结果。
版本1
#include <cstdio> #include <opencv2/opencv.hpp> using namespace cv; int main(int argc, char *argv[]) { if (argc != 2) { printf("usage : DisplayImage.out <image_path>\n"); return -1; } Mat img = imread(argv[1], IMREAD_COLOR); if (!img.data) { printf("No image data...\n"); return -1; } namedWindow("Display Image", WINDOW_AUTOSIZE); imshow("Display Image", img); waitKey(0); return 0; }
编译并运行上述版本,结果以下。
版本2
#include <opencv2/opencv.hpp> #include <iostream> #include <string> using namespace cv; int main(int argc, char *argv[]) { // default image name std::string imgName("../images/lena.jpg"); if (argc > 1) imgName = argv[1]; // load image file Mat img = imread(imgName, IMREAD_COLOR); if (img.empty()) { std::cout << "Could not load image..." << std::endl; return -1; } // create a image placeholder and show the image inside it namedWindow("Display Image", WINDOW_AUTOSIZE); imshow("Display Image", img); // wait for a key press waitKey(0); return 0; }
编译并运行上述版本,结果以下。
#include <opencv2/opencv.hpp> using namespace cv; int main(int argc, char *argv[]) { if (argc != 3) { std::cout << "usage : convert.out <src_img_path> <des_img_path>" << std::endl; return -1; } Mat src = imread(argv[1], IMREAD_COLOR); if (src.empty()) { std::cout << "could not load image..." << std::endl; return -1; } Mat src_gray; cvtColor(src, src_gray, COLOR_BGR2GRAY); imwrite(argv[2], src_gray); namedWindow(argv[1], WINDOW_AUTOSIZE); namedWindow(argv[2], WINDOW_AUTOSIZE); imshow(argv[1], src); imshow(argv[2], src_gray); waitKey(0); return 0; }
编译并运行上述版本,结果以下。