本科学电磁场,研究生学阵列信号处理,本以为毕业可以进研究所为军工雷达做点贡献。不成想,最后成为了一名Android(系统级)开发工程师,而且一干就干了将近三年。或者,也可以就这样干下去,逆来顺受也算是本份庄稼人的特点。但是,进城待久了,又忍不住东想西想。作为第一代进城的庄稼人,矛盾就这样在身体内来回撺掇,这种滋味说实话……怪不得人家都说平淡是福。开始,一有矛盾,我就用打游戏来调和——连输几局之后,什么想法都没有了。可是,最近堕落得游戏都不想打了,苦恼!听说数字图像处理在人工智能上能有用,人工智能又据说会很火。既然都是荒废生命,就换一个方式吧,来学学OpenCV,只是不知道能坚持多长时间!!管不了那么多了,男人,哪怕多坚持一秒也很屌了,开干!
网上搜索了一下,要下载OpenCV和VS。我一般都喜欢下载最新的,对于菜鸟来说,时间上领先也算是一种领先吧。
1.首先我就下载了VS2017和OpenCV3.4.1,还挺顺利,都下载下来了。
2.安装VS2017和OpenCV,然后为OpenCV添加环境变量。
安装VS2017的时候才发现,自己的硬盘空间不够了。15年底买电脑的时候,为了开机快和省钱,就配了一个128G的固态硬盘,心想着也够用了,比我退役的笔记本空间大多了。本来嘛,虽然是打着学习Android配的电脑,但是主要用途还是打游戏……没办法,又买了1T的机械硬盘。安装硬盘也是耽误了我近一周的时间,想想都惭愧,因为买硬盘的时候我都没有想过还需要一个电源线和mount用的数据线……
3.打开VS2017,然后照着网上说的新建一个项目。
悲剧就这个时候发生了,原来win7是用不了VS2017的。唉,别的都好说,就是这个操作系统我最讨厌换了,上学的时候换一次坑一次。这次没办法,升级win10吧。还是去网上搜,找到了一个升级工具,花了将近两天的时间(加班太多),最终没有升级成功!!!还检测出来我的操作系统不是正版,一个劲儿的让我激活。网上找了个激活码,这事儿就做罢了。东西都还没学到手,想让我花钱来买操作系统,我觉得还是挺难的。
4.卸载VS2017,重新卸载其他版本的VS。这次我一共下载了2017以下的四五个版本,首先还是从VS2015开始试水。幸运的是,VS2015完全没问题。
5.打开VS2015,新建了一个项目。按照网上的描述,创建的是win32控制台程序(还不清楚原因,比葫芦画瓢呗)和空项目。接着是在属性窗口的VC++目录下添加包含目录和库目录。http://www.bubuko.com/infodetail-1479420.html 我参考了很多人的博客,这个算是一个。
6.demo程序验证。
#include<opencv2\opencv.hpp>
using namespace cv;
int main()
{
Mat picture = imread("wallpaper.jpg");//图片必须添加到工程目录下
//也就是和test.cpp文件放在一个文件夹下!!!
imshow("测试程序", picture);
waitKey(20150901);
}
这个也是上面博客上的demo,但是测试的时候总是有问题。可能是版本不一样?编译都过不了!参照下面博文https://blog.csdn.net/cooelf/article/details/24499473 启用源服务器调试。这样,之前的问题解决了,但是新的问题也出现了。跑出来的图片秒消失。网上说用waitKey才显示,后面发现加上system("pause");挺好使。这个时候图片窗口出来了,只是显示的是一团灰。网上有说是图片没有加载上来,然后就加了下面的语句去判断,发现并不是。最后试了在imshow之前加了namedWindow("test");这次真的出现了,嗨开森!
if (picture.empty()){
std::cout << "Can not load image" << "\n";
return -1;
}
最终代码:
#include "cv.h" // OpenCV 文件头
#include "highgui.h"
#include "cvaux.h"
#include "cxcore.h"
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
int main()
{
double fscale = 1;
Size outsize;
Mat picture = imread("F:\\VS2015\\ConsoleApplication1\\ConsoleApplication1\\ran.jpg");
if (picture.empty()){
std::cout << "Can not load image" << "\n";
return -1;
}
outsize.width = picture.cols*fscale;
outsize.height = picture.rows*fscale;
Mat outpic;
resize(picture, outpic, outsize, 0, 0, INTER_AREA);
//图片必须添加到工程目下
//也就是和test.cpp文件放在一个文件夹下!!!
namedWindow("test");
imshow("test", outpic);
waitKey(0);
system("pause");
}
PS:为什么imshow前面要加上nameWindow,网上也没有明确说。看了一下源码:
void cv::imshow( const String& winname, InputArray _img )
{
CV_TRACE_FUNCTION();
const Size size = _img.size();
#ifndef HAVE_OPENGL
CV_Assert(size.width>0 && size.height>0);
{
Mat img = _img.getMat();
CvMat c_img = img;
cvShowImage(winname.c_str(), &c_img);
}
#else
const double useGl = getWindowProperty(winname, WND_PROP_OPENGL);
CV_Assert(size.width>0 && size.height>0);
if (useGl <= 0)
{
Mat img = _img.getMat();
CvMat c_img = img;
cvShowImage(winname.c_str(), &c_img);
}
else
{
const double autoSize = getWindowProperty(winname, WND_PROP_AUTOSIZE);
if (autoSize > 0)
{
resizeWindow(winname, size.width, size.height);
}
setOpenGlContext(winname);
cv::ogl::Texture2D& tex = ownWndTexs[winname];
if (_img.kind() == _InputArray::CUDA_GPU_MAT)
{
cv::ogl::Buffer& buf = ownWndBufs[winname];
buf.copyFrom(_img);
buf.setAutoRelease(false);
tex.copyFrom(buf);
tex.setAutoRelease(false);
}
else
{
tex.copyFrom(_img);
}
tex.setAutoRelease(false);
setOpenGlDrawCallback(winname, glDrawTextureCallback, &tex);
updateWindow(winname);
}
#endif
}
这里传入的windowname是一个常量引用,可能是要通过namedWindow创建一个window才能引用?但是,我发现当namedWindow和imshow传入的windowname不相等时也可以显示出来图片,只是会多一个灰色的窗口。暂时搞不懂了!
先到这里了,希望坚持!