用OpenCV读取图像并且显示

来源:互联网 发布:网络打印机ip地址查询 编辑:程序博客网 时间:2024/06/03 22:55

源引

今天早上在用opencv读取函数载入图片并且显示都出现了问题,自己搞了半天都没解决。最后参考官方Example解决了,并且仔细阅读了代码解释,将原因弄清楚了。
而图像(视频帧)的读取显示非常重要,所以在这里记录下来。

Windows + VS2013平台

#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>using namespace std;using namespace cv;int main(int argc, char** argv){    if (argc != 2) {        cout << "Please input a image or video frame" << endl;        return -1;    }    String input_file = argv[1];    Mat image = imread(input_file);    if (!image.data) {        cout << "Could not open or find the image" << endl;        return -1;    }    namedWindow("Display window", WINDOW_NORMAL);    imshow("Display window", image);    waitKey(0);    return 0;}

问题分析:

自己写代码的时候没有写边界检查,所以都不知道是文件目录没有读取到,还是显示的问题, 所以IO处理一定要进行边界检查。
这里主要的问题是waitKey()函数,我在Ubuntu下没有写这个函数,程序编译没问题,但是就是不显示图像,原因是用waitKey()去等待用户按某个键,图像就不显示了。如果不写,自然就看不到。
waitkey(0)代表永久等待,其中单位为milliseconds.
在Windows平台的展示是基于QT的,所以要想缩放图像大小,nameWindow()中的第二个参数要设置为WINDOW_NORMAL,才可以进行缩放操作。
namedWindow()函数这里是可选的,就是创建一个带有名字的窗口,如果不写这个函数,inshow()也会自己创建一个对应的窗口。但是inshow()可以指定到特定的窗口上显示图片数据。

这里有个问题未解决就是,VS为什么识别不了绝对路径

Ubuntu + Clion

#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>using namespace std;using namespace cv;int main(int argc, char** argv){    if (argc != 2) {        cout << "Please input a image or video frame" << endl;        return -1;    }    String input_file = argv[1];    Mat image = imread(input_file);    if (image.empty()) {        cout << "Could not open or find the image" << endl;        return -1;    }    namedWindow("Display window");    imshow("Display window", image);    waitKey(0);    return 0;}

代码分析:

和Window平台下基本一致,不过这里nameWindow()第二个参数可以不用赋值,默认WINDOW_AUTOSIZE就可以缩放了。

##总结:
有问题多看官方用例和Demo,多积累基础工具。
##参考:
http://docs.opencv.org/2.4/doc/tutorials/introduction/display_image/display_image.html

1 0
原创粉丝点击