OpenCV的库实在以前就编译过的,当时也没记录下来,回头再整理,今天就是在Qt下创建控制台程序,我直接贴出源码,一句一句的说明,其实这些代码也是按照书里来的,我给翻译一下,再加入一点我自己的理解,大家可以去看原文
1、创建一个Qt的控制台程序
2、修改项目配置文件.pro文件
QT += core QT -= gui TARGET = opcvtest CONFIG += console CONFIG -= app_bundle TEMPLATE = app SOURCES += main.cpp ###注意添加此行,表示增加OpenCV的头文件目录为系统目录 INCLUDEPATH += D:\OpenCV\include ###此为增加库文件目录-L选项在gcc下就是添加库文件目录,而-l则为添加库文件 LIBS += -LD:\OpenCV\lib \ -lopencv_core230.dll \ -lopencv_highgui230.dll \ -lopencv_imgproc230.dll \ -lopencv_features2d230.dll \ -lopencv_calib3d230.dll3、main.cpp替换为下列代码
#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<iostream> #include<string> int main(int argc, char *argv[]) { //利用sdl标准库string保存文件目录,注意'\'需要转义 std::string dir="I:\\photo\\info_indexbg.png"; //创建一个图像的存储矩阵容器,Mat包含一个头信息和数据信息 //头信息包含了图像的一些数据,默认创建图像宽高为0,可以用Mat的size()方法获取宽高 cv::Mat image; //宽高均为0 std::cout << "size: " << image.size().height << " , " << image.size().width << std::endl; //读取文件 image = cv::imread(dir); //如果读取失败的话Mat的data变量为空 if (!image.data) { std::cout<<"no data be read\n"; return 0; } //再次输出图像大小 std::cout << "size: " << image.size().height << " , " << image.size().width << std::endl; //创建一个Windows窗口,其实我在程序中屏蔽调这句也正常输出了图像,具体不知道为啥 cv::namedWindow("我的图片"); //我们在申请一个Mat容器,用于存放修改后图像 cv::Mat result; //OpenCV 提供了很多图像处理函数,下面函数提供了图像反转的功能 cv::flip(image,result,-1); //正数水平反转 // 0垂直反转 //负数水平垂直一起反转 //显示反转的图片 cv::imshow("我的图片",result); //将反转后的图像写入文件,估计OpenCV会自动根据你写入文件的扩展名保存为不同类型,我测试jpg和png,保存后大小不一样 cv::imwrite("output.png", result); //图像等待输入时间 cv::waitKey(0); //0则一直等待,单位ms return 0; }
4、简单介绍一下Mat类型
Mat类型是OpenCV图像存储的基本类型,而OpenCV对该类型提供了自动的内存管理,并且优化了拷贝,通常情况下的复制仅仅复制个Mat类型的头信息,数据还指向原数据,如下:
cv::Mat ima(240,320,CV_8U,cv::Scalar(100)); cv::Mat image2, image3; image2= ima; // 两个容器指向相同的图像数据 ima.copyTo(image3); //图像数据进行了copy
CV_8U 这个8表示8位数据,U表示unsigned的,S表示signed,CV_8UC3 C3表示3个通道