OpenCV下载、安装以及使用

这篇具有很好参考价值的文章主要介绍了OpenCV下载、安装以及使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、安装Visual Studio

OpenCV是一种开源的计算机视觉开发库。既然是开发库,那么必须依托某种语言程序来加载。以C++为例,在安装OpenCV之前,必须安装C++的程序开发环境(IDE),在此我们选择Visual Studio Community——VS社区版,这个版本是免费的。

中文版下载安装地址:
https://visualstudio.microsoft.com/zh-hans/downloads/

注意这是一个在线安装的版本,请确保在安装过程中网络畅通。

二、创建C++程序

我们需要在VS中建立应用程序。在此我们建立最简单的基于控制台的应用程序,项目名为face1。
OpenCV下载、安装以及使用

三、下载OpenCV

所谓OpenCV的安装,其实就是把OpenCV的库路径加入我们已有的项目路径集合当中。现在有两种方法,一种是自己下载OpencCV源码,在源码的基础上编译成库(lib/dll)文件,一种是下载直接编译好的库文件, 我们选择直接下载已经编译好的库文件

最新版OpenCV Lib 下载链接
https://sourceforge.net/projects/opencvlibrary/files/latest/download
一共266MB,外网有的时候挺慢的。

四、安装/配置OpenCV

下载后OpenCV后,运行,解压到一个固定目录。比如我的:“D:\试验\软件\opencv”——这个路径稍后要作为库和头文件的路径,加入以后C++程序项目中
在VS中,因为每个项目都是独立编译的,所以,每个项目具有自己的“规则包“。也就是说,对着项目名称右键,选择”属性“,可以配置该项目的编译规则。
现在我们在属性窗口中,配置OpenCV路径,步骤如下

1、在属性窗口中,我们选择输出目标”配置”为“Debug“,”平台“为”x64“。也就是编译输出在64位windows系统中运行的调试版(debug)应用程序
OpenCV下载、安装以及使用

2、左边选择VC++目录,右边选中“包含目录“项进行编辑。把刚在OpenCV解压目录下的“include”目录包含进来。然后确定

3、重复上述步骤2。右边选中“库目录“项进行编辑。把刚在OpenCV解压目录下的“库目录”包含进来。然后确定
OpenCV下载、安装以及使用

4、在属性窗口中,左边选中“链接器->输入“。右边选中“附加依赖项”。把刚在OpenCV解压后产生的静态引用库名字“opencv_world3416.lib”加进来(注意名字后面的数字部分视各个版本不同而不同)。然后确定。

OpenCV下载、安装以及使用

5、最后将OpenCV解压目录下的dll文件拷贝到程序运行所在的目录

OpenCV下载、安装以及使用

五、运行OpenCV程序

在已经建立好的项目“face1”的源代码中,加入opencv头文件
OpenCV下载、安装以及使用

接着,在程序中就可以使用openCV所提供的库函数了。
比如在这个例子中:
我们读取事先准备好的一张图片,并输出它的尺寸:

OpenCV下载、安装以及使用

运行结果:
OpenCV下载、安装以及使用

六、利用OpenCV程序进行人脸检测。
这个实例在opencv安装目录下的“samples/c++”目录下。该目录有大量实例,可以一一尝试运行。

OpenCV下载、安装以及使用

在此我们选择facedetect.cpp。复制相应代码运行
注意头文件需要做参照以下(而非例程中所示):

OpenCV下载、安装以及使用

接着我们把这个项目所需要的数据文件移动到该项目应用程序所在目录

OpenCV下载、安装以及使用
整个实验程序源码如下:

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

static void help(const char** argv)
{
    cout << "\nThis program demonstrates the use of cv::CascadeClassifier class to detect objects (Face + eyes). You can use Haar or LBP features.\n"
            "This classifier can recognize many kinds of rigid objects, once the appropriate classifier is trained.\n"
            "It's most known use is for faces.\n"
            "Usage:\n"
        <<  argv[0]
        <<  "   [--cascade=<cascade_path> this is the primary trained classifier such as frontal face]\n"
            "   [--nested-cascade[=nested_cascade_path this an optional secondary classifier such as eyes]]\n"
            "   [--scale=<image scale greater or equal to 1, try 1.3 for example>]\n"
            "   [--try-flip]\n"
            "   [filename|camera_index]\n\n"
            "example:\n"
        <<  argv[0]
        <<  " --cascade=\"data/haarcascades/haarcascade_frontalface_alt.xml\" --nested-cascade=\"data/haarcascades/haarcascade_eye_tree_eyeglasses.xml\" --scale=1.3\n\n"
            "During execution:\n\tHit any key to quit.\n"
            "\tUsing OpenCV version " << CV_VERSION << "\n" << endl;
}

void detectAndDraw( Mat& img, CascadeClassifier& cascade,
                    CascadeClassifier& nestedCascade,
                    double scale, bool tryflip );

string cascadeName;
string nestedCascadeName;

int main( int argc, const char** argv )
{
    VideoCapture capture;
    Mat frame, image;
    string inputName;
    bool tryflip;
    CascadeClassifier cascade, nestedCascade;
    double scale;

    cv::CommandLineParser parser(argc, argv,
        "{help h"
        "{cascade|data/haarcascades/haarcascade_frontalface_alt.xml|}"
        "{nested-cascade|data/haarcascades/haarcascade_eye_tree_eyeglasses.xml|}"
        "{scale|1|}{try-flip||}{@filename||}"
    );
    if (parser.has("help"))
    {
        help(argv);
        return 0;
    }
    cascadeName = parser.get<string>("cascade");
    nestedCascadeName = parser.get<string>("nested-cascade");
    scale = parser.get<double>("scale");
    if (scale < 1)
        scale = 1;
    tryflip = parser.has("try-flip");
    inputName = parser.get<string>("@filename");
    if (!parser.check())
    {
        parser.printErrors();
        return 0;
    }
    if (!nestedCascade.load(samples::findFileOrKeep(nestedCascadeName)))
        cerr << "WARNING: Could not load classifier cascade for nested objects" << endl;
    if (!cascade.load(samples::findFile(cascadeName)))
    {
        cerr << "ERROR: Could not load classifier cascade" << endl;
        help(argv);
        return -1;
    }
    if( inputName.empty() || (isdigit(inputName[0]) && inputName.size() == 1) )
    {
        int camera = inputName.empty() ? 0 : inputName[0] - '0';
        if(!capture.open(camera))
        {
            cout << "Capture from camera #" <<  camera << " didn't work" << endl;
            return 1;
        }
    }
    else if (!inputName.empty())
    {
        image = imread(samples::findFileOrKeep(inputName), IMREAD_COLOR);
        if (image.empty())
        {
            if (!capture.open(samples::findFileOrKeep(inputName)))
            {
                cout << "Could not read " << inputName << endl;
                return 1;
            }
        }
    }
    else
    {
        image = imread(samples::findFile("lena.jpg"), IMREAD_COLOR);
        if (image.empty())
        {
            cout << "Couldn't read lena.jpg" << endl;
            return 1;
        }
    }

    if( capture.isOpened() )
    {
        cout << "Video capturing has been started ..." << endl;

        for(;;)
        {
            capture >> frame;
            if( frame.empty() )
                break;

            Mat frame1 = frame.clone();
            detectAndDraw( frame1, cascade, nestedCascade, scale, tryflip );

            char c = (char)waitKey(10);
            if( c == 27 || c == 'q' || c == 'Q' )
                break;
        }
    }
    else
    {
        cout << "Detecting face(s) in " << inputName << endl;
        if( !image.empty() )
        {
            detectAndDraw( image, cascade, nestedCascade, scale, tryflip );
            waitKey(0);
        }
        else if( !inputName.empty() )
        {
            /* assume it is a text file containing the
            list of the image filenames to be processed - one per line */
            FILE* f = fopen( inputName.c_str(), "rt" );
            if( f )
            {
                char buf[1000+1];
                while( fgets( buf, 1000, f ) )
                {
                    int len = (int)strlen(buf);
                    while( len > 0 && isspace(buf[len-1]) )
                        len--;
                    buf[len] = '\0';
                    cout << "file " << buf << endl;
                    image = imread( buf, 1 );
                    if( !image.empty() )
                    {
                        detectAndDraw( image, cascade, nestedCascade, scale, tryflip );
                        char c = (char)waitKey(0);
                        if( c == 27 || c == 'q' || c == 'Q' )
                            break;
                    }
                    else
                    {
                        cerr << "Aw snap, couldn't read image " << buf << endl;
                    }
                }
                fclose(f);
            }
        }
    }

    return 0;
}

void detectAndDraw( Mat& img, CascadeClassifier& cascade,
                    CascadeClassifier& nestedCascade,
                    double scale, bool tryflip )
{
    double t = 0;
    vector<Rect> faces, faces2;
    const static Scalar colors[] =
    {
        Scalar(255,0,0),
        Scalar(255,128,0),
        Scalar(255,255,0),
        Scalar(0,255,0),
        Scalar(0,128,255),
        Scalar(0,255,255),
        Scalar(0,0,255),
        Scalar(255,0,255)
    };
    Mat gray, smallImg;

    cvtColor( img, gray, COLOR_BGR2GRAY );
    double fx = 1 / scale;
    resize( gray, smallImg, Size(), fx, fx, INTER_LINEAR_EXACT );
    equalizeHist( smallImg, smallImg );

    t = (double)getTickCount();
    cascade.detectMultiScale( smallImg, faces,
        1.1, 2, 0
        //|CASCADE_FIND_BIGGEST_OBJECT
        //|CASCADE_DO_ROUGH_SEARCH
        |CASCADE_SCALE_IMAGE,
        Size(30, 30) );
    if( tryflip )
    {
        flip(smallImg, smallImg, 1);
        cascade.detectMultiScale( smallImg, faces2,
                                 1.1, 2, 0
                                 //|CASCADE_FIND_BIGGEST_OBJECT
                                 //|CASCADE_DO_ROUGH_SEARCH
                                 |CASCADE_SCALE_IMAGE,
                                 Size(30, 30) );
        for( vector<Rect>::const_iterator r = faces2.begin(); r != faces2.end(); ++r )
        {
            faces.push_back(Rect(smallImg.cols - r->x - r->width, r->y, r->width, r->height));
        }
    }
    t = (double)getTickCount() - t;
    printf( "detection time = %g ms\n", t*1000/getTickFrequency());
    for ( size_t i = 0; i < faces.size(); i++ )
    {
        Rect r = faces[i];
        Mat smallImgROI;
        vector<Rect> nestedObjects;
        Point center;
        Scalar color = colors[i%8];
        int radius;

        double aspect_ratio = (double)r.width/r.height;
        if( 0.75 < aspect_ratio && aspect_ratio < 1.3 )
        {
            center.x = cvRound((r.x + r.width*0.5)*scale);
            center.y = cvRound((r.y + r.height*0.5)*scale);
            radius = cvRound((r.width + r.height)*0.25*scale);
            circle( img, center, radius, color, 3, 8, 0 );
        }
        else
            rectangle( img, Point(cvRound(r.x*scale), cvRound(r.y*scale)),
                       Point(cvRound((r.x + r.width-1)*scale), cvRound((r.y + r.height-1)*scale)),
                       color, 3, 8, 0);
        if( nestedCascade.empty() )
            continue;
        smallImgROI = smallImg( r );
        nestedCascade.detectMultiScale( smallImgROI, nestedObjects,
            1.1, 2, 0
            //|CASCADE_FIND_BIGGEST_OBJECT
            //|CASCADE_DO_ROUGH_SEARCH
            //|CASCADE_DO_CANNY_PRUNING
            |CASCADE_SCALE_IMAGE,
            Size(30, 30) );
        for ( size_t j = 0; j < nestedObjects.size(); j++ )
        {
            Rect nr = nestedObjects[j];
            center.x = cvRound((r.x + nr.x + nr.width*0.5)*scale);
            center.y = cvRound((r.y + nr.y + nr.height*0.5)*scale);
            radius = cvRound((nr.width + nr.height)*0.25*scale);
            circle( img, center, radius, color, 3, 8, 0 );
        }
    }
    imshow( "result", img );
}

运行程序。该程序会自动打开摄像头,识别并定位摄像头前的人脸以及眼睛部位。
输入q或者Q,退出程序。

下一篇------参数解析文章来源地址https://www.toymoban.com/news/detail-474894.html

到了这里,关于OpenCV下载、安装以及使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LaTex下载、安装及配置并搭配使用Visual Studio Code教程(建议收藏)2022最新完整版

    LaTex下载、安装及配置并搭配使用Visual Studio Code教程(保姆级超详细)2022最新完整版 LaTeX (/ˈlɑːtɛx/,常被读作/ˈlɑːtɛk/或/ˈleɪtɛk/,风格化后写作“LATEX”),是一种基于TEX的排版系统,由美国计算机科学家莱斯利·兰伯特在20世纪80年代初期开发,利用这种格式系统的处

    2023年04月20日
    浏览(142)
  • OpenCV下载、安装以及使用

    一、安装Visual Studio OpenCV是一种开源的计算机视觉开发库。既然是开发库,那么必须依托某种语言程序来加载。以C++为例,在安装OpenCV之前,必须安装C++的程序开发环境(IDE),在此我们选择Visual Studio Community——VS社区版,这个版本是免费的。 中文版下载安装地址: https:/

    2024年02月08日
    浏览(27)
  • Visual Studio更改并下载.Net Framework目标框架以及Nuget包下载

    🌀当使用.net进行开发时,开发的项目与.net framework目标框架会非常密切相关的,所以当vs本地使用的.net framework框架与该项目工程的框架不一致的时候,就可能打开不了当前项目,解决这个问题的方法有: 第一种:要更改目标框架以适应当前VS的; 第二种:或者根据目标框架

    2024年02月05日
    浏览(64)
  • C/C++图形库EasyX保姆级使用教程(一) Microsoft Visual Studio 2022和EasyX的下载及安装使用

    第一章 Microsoft Visual Studio 2022和EasyX的下载及安装使用

    2024年02月11日
    浏览(54)
  • Visual Studio 2019 下载安装

    1、从官网下载最新版本 下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux (microsoft.com) https://visualstudio.microsoft.com/zh-hans/downloads/ 2、Visual Studio 2019安装包网盘链接:       https://pan.baidu.com/s/13H6TfDU-uyLxJssERvXgTw?  pwd=1234            提取码:1234  1、存储路径找到下载文件,双击

    2024年02月07日
    浏览(83)
  • Visual Studio安装及下载

    由于近期要将C语言作为学习工具,所以就翻看了很多文章以及了解了很多C语言开发工具。经过再三斟酌,决定将Visual Studio作为开发工具,作为初学者,下面详细介绍了该开发工具的安装与使用。希望后续的学习能够得到顺利的提升。 Microsoft Visual Studio (简称VS)是微软公司

    2024年02月03日
    浏览(41)
  • Visual Studio2022下载安装教程

    首先去官网下载vs的安装包https://visualstudio.microsoft.com 日常学习使用,选择社区版就可以。 然后等待下载完成,双击安装 Visual Studio安装 根据官网的提示,要至少选择【Desktop Development with C++】 然后更改一下下载的路径,个人建议放在D盘,不要放在C盘,因为该软件所占内存比

    2024年02月11日
    浏览(48)
  • Visual Studio的下载与安装

    官网下载 网址:免费的开发人员软件和服务 - Visual Studio (microsoft.com) 直接下载社区版(Visual Studio Community) 安装相关组件 运行下载完成的Visual Studio Installer 勾选 .NET桌面开发 、 使用C++的桌面开发 以及 其他工具集 中的 Visual Studio 扩展开发 默认安装位置改到D盘(如果C盘空间

    2024年02月11日
    浏览(50)
  • 2.Visual Studio下载和安装

            Visual Studio 是微软提供的一个集成开发环境(IDE),主要用于为 Windows 系统开发应用程序。Visual Studio 提供了构建 .Net 平台应用程序的一站式服务,可以使用 Visual Studio 开发、调试和运行应用程序。 1、Visual Studio下载         首先从微软官网(下载 Visual Studio

    2024年02月04日
    浏览(42)
  • 完善解决Visual Studio无法下载安装问题

    今天把很久没用的一台台式电脑重装了系统,然后安装visual studio,去官网下载在线安装器visual studio 2022 installer,但是发现下载不了,提示\\\"无法访问此页面\\\"如下图所示: 无耐百度找了个连接下载了安装器vs_professional.exe,但是安装时又是连接 不上,如下图所示: 百度查了很多方法,有说

    2024年02月04日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包