OpenCV初试云雨

     本科学电磁场,研究生学阵列信号处理,本以为毕业可以进研究所为军工雷达做点贡献。不成想,最后成为了一名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不相等时也可以显示出来图片,只是会多一个灰色的窗口。暂时搞不懂了!

先到这里了,希望坚持!





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值