OpenCV编程入门——启程前的准备

简介: OpenCV编程入门——启程前的准备

一、OpenCV官方例程与赏析

1、彩色目标跟踪:Camshift(Continuously Adaptive Mean-SHIFT)

说明:程序的用法是根据鼠标框选区域的色度光谱来进行摄像头读入视频的目标跟踪。

2、光流:optical flow

说明:光流法是目前运动图像分析的重要方法,用来指定时变图像中模式的运动速度,因为当物体在运动时,在图像上对应的亮度模式也在运行。这种图像亮度模式的表观运动(apparent motion)就是光流。光流表达了图像的变化,由于它包含了目标运动的信息。

3、点追踪

说明:程序运行后,自动启动摄像头,摄像头会追踪移动的物体,可以看到物体上的点随这物体一起运动。

源码来源:opencv\sources\samples\cpp 中的 lkdemo.cpp

#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/videoio.hpp"
#include "opencv2/highgui.hpp"

#include <iostream>
#include <ctype.h>

using namespace cv;
using namespace std;

static void help()
{
    // print a welcome message, and the OpenCV version
    cout << "\nThis is a demo of Lukas-Kanade optical flow lkdemo(),\n"
            "Using OpenCV version " << CV_VERSION << endl;
    cout << "\nIt uses camera by default, but you can provide a path to video as an argument.\n";
    cout << "\nHot keys: \n"
            "\tESC - quit the program\n"
            "\tr - auto-initialize tracking\n"
            "\tc - delete all the points\n"
            "\tn - switch the \"night\" mode on/off\n"
            "To add/remove a feature point click it\n" << endl;
}

Point2f point;
bool addRemovePt = false;

static void onMouse( int event, int x, int y, int /*flags*/, void* /*param*/ )
{
    if( event == EVENT_LBUTTONDOWN )
    {
        point = Point2f((float)x, (float)y);
        addRemovePt = true;
    }
}

int main( int argc, char** argv )
{
    VideoCapture cap;
    TermCriteria termcrit(TermCriteria::COUNT|TermCriteria::EPS,20,0.03);
    Size subPixWinSize(10,10), winSize(31,31);
    const int MAX_COUNT = 500;
bool needToInit = false;
bool nightMode = false;

help();
cv::CommandLineParser parser(argc, argv, "{@input|0|}");
string input = parser.get<string>("@input");

if( input.size() == 1 && isdigit(input[0]) )
    cap.open(input[0] - '0');
else
    cap.open(input);

if( !cap.isOpened() )
{
    cout << "Could not initialize capturing...\n";
    return 0;
}

namedWindow( "LK Demo", 1 );
setMouseCallback( "LK Demo", onMouse, 0 );

Mat gray, prevGray, image, frame;
vector<Point2f> points[2];

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

    frame.copyTo(image);
    cvtColor(image, gray, COLOR_BGR2GRAY);

    if( nightMode )
        image = Scalar::all(0);

    if( needToInit )
    {
        // automatic initialization
        goodFeaturesToTrack(gray, points[1], MAX_COUNT, 0.01, 10, Mat(), 3, 3, 0, 0.04);
        cornerSubPix(gray, points[1], subPixWinSize, Size(-1,-1), termcrit);
        addRemovePt = false;
    }
    else if( !points[0].empty() )
    {
        vector<uchar> status;
        vector<float> err;
        if(prevGray.empty())
            gray.copyTo(prevGray);
        calcOpticalFlowPyrLK(prevGray, gray, points[0], points[1], status, err, winSize,
                             3, termcrit, 0, 0.001);
        size_t i, k;
        for( i = k = 0; i < points[1].size(); i++ )
        {
            if( addRemovePt )
            {
                if( norm(point - points[1][i]) <= 5 )
                {
                    addRemovePt = false;
                    continue;
                }
            }

            if( !status[i] )
                continue;

            points[1][k++] = points[1][i];
            circle( image, points[1][i], 3, Scalar(0,255,0), -1, 8);
        }
        points[1].resize(k);
    }

    if( addRemovePt && points[1].size() < (size_t)MAX_COUNT )
    {
        vector<Point2f> tmp;
        tmp.push_back(point);
        cornerSubPix( gray, tmp, winSize, Size(-1,-1), termcrit);
        points[1].push_back(tmp[0]);
        addRemovePt = false;
    }

    needToInit = false;
    imshow("LK Demo", image);

    char c = (char)waitKey(10);
    if( c == 27 )
        break;
    switch( c )
    {
    case 'r':
        needToInit = true;
        break;
    case 'c':
        points[0].clear();
        points[1].clear();
        break;
    case 'n':
        nightMode = !nightMode;
        break;
    }
    std::swap(points[1], points[0]);
    cv::swap(prevGray, gray);
}
  return 0;
}

4、人脸识别:objectDetection

说明:运行程序后,将自己的脸对准摄像头或者放置一张照片对准摄像头任其捕获,便可以发现程序准确地识别人脸,并用彩色的圆将脸圈出。

5、支持向量机引导

说明:它是一个类分类器,能够将不同类样本在样本空间分隔的超平面

svm分类算法在opencv3中有很大的变动,取消了CvSVMParams这个类。

二、编译OpenCV源代码

1、下载安装CMake:windows平台下生成OpenCV的解决方案。

说明:CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。

这个我安装的也不知道对不对,但是结果也书上一样,新手体谅,可以参考其他大牛

2、“opencv.hpp”头文件认知

说明:opencv.hpp头文件中包含了OpenCV各模块的头文件,如高层GUI图形用户界面(highgui.hpp)、图像处理模块(imgproc.hpp)、以及2D特征模块(features2d.hpp)。所以在接下来编写:core、objdetect、imgproc、photo、video、features2d、calib3d、ml、highgui、contrib模块的应用程序都应该加此头文件。

3、命名规范约定

说明:如下截图所示:

三、argc与argv参数解惑

1、初识main函数中的argc和argv

argc和argv中的arg指的是“参数”。其中argc为整数,用来统计运行程序时送给main函数的命令行参数的个数;而*argv[ ]:为字符串数组,用来存放指向字符串参数的指针数组,每一个元素指向一个参数。

初学者(例如我)一般会弱化argc和argv的用法,main函数往往不带参数。

int main(){
}

而在官方示例中,写法如下

int main(int argc,char** argv){

}

2、argc、argv的具体含义

主函数main中变量(int argc,char* argv[ ])的含义:

说明:第一个参数,int类型的argc,用来统计程序运行时发送给main函数的命令行参数的个数,在VS中默认为1。第二个参数,char* argv[ ],为字符串数组,用来存放指向字符串参数的指针数组,每一个元素指向一个参数:

  • argv[0]指向程序运行的全路径名。
  • argv[1]指向在DOS命令行中执行程序名后的第一个字符串
  • argv[2]指向执行程序名后的第二个字符串
  • argv[3]指向执行程序名后的第三个字符串
  • argv[argc]为NULL

测试:

#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{
  std::cout << argc<<endl;
  for (int i = 0; i < argc; i++)
  {
    cout <<"argv["<<i<<"]"<<"="<< argv[i]<<endl;
  }
  return 0;
}

3、VS中的main函数的几种写法说明

(1)返回值为整型带参的main函数

int main(int argc, char **argv)
{
  //函数体内使用或者不使用argc和argv都可行
  return 1;
}

(2)返回值为整型不带参的main函数

int main(int argc, char **argv)
{
  //函数体内使用argc和argv
  return 1;
}

(3)返回值为void且不带参的main函数

int main()
{
  return 1;
}

四、格式输出函数printf()简析

1、格式输出:printf()函数

说明:虽然printf()是标准的C语言函数,但是在opencv中使用opencv.hpp头文件之后就可以使用它。

2、示例演示

#include<opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char *argv[])
{
  int a = 66,b=68;
  printf("\n\t%d %d\n", a,b);//输出10进制整型
  printf("\n\t%06d,%06d\n", a, b);//输出6位10进制整型
  printf("\n\t%c,%c\n", a, b);//输出a,b的ASCII码对应的字符
  getchar();//等待读入任意字符结束
  return 0;
}

结论:

学到这第二章也勉勉强强学完了。中间也经历了很多无奈,一个程序(Cmake)安装耗费一天,错的问题自己也不知道啥意思,问也不知道问谁,只能自己慢慢摸索(卸了重装,百度到处搜)。时间还长,日子还久,我相信终究会好的。也希望大佬指出我的问题。

相关文章
|
6月前
|
存储 编解码 算法
OpenCV2 计算机视觉应用编程秘籍:6~10
OpenCV2 计算机视觉应用编程秘籍:6~10
73 0
|
6月前
|
设计模式 算法 开发工具
OpenCV2 计算机视觉应用编程秘籍:1~5
OpenCV2 计算机视觉应用编程秘籍:1~5
72 0
|
6月前
|
存储 Java Android开发
OpenCV3 安卓应用编程:1~6 全
OpenCV3 安卓应用编程:1~6 全
42 0
|
6月前
|
存储 算法 开发工具
OpenCV 安卓编程示例:1~6 全
OpenCV 安卓编程示例:1~6 全
149 0
|
计算机视觉 C++
11.【openCV计算机视觉入门基础】
11.【openCV计算机视觉入门基础】
63 0
|
3月前
|
编译器 开发工具 C语言
解锁QtCreator跨界神技!Windows下轻松驾驭OpenCV动态库,让你的跨平台开发如虎添翼,秒变视觉编程大师!
【8月更文挑战第4天】QtCreator是一款强大的跨平台IDE,便于创建多平台应用。本教程教你如何在Windows环境下集成OpenCV库至Qt项目。首先,下载匹配MinGW的OpenCV预编译版并解压。接着,在QtCreator中新建或打开项目,并在.pro文件中添加OpenCV的头文件和库文件路径。确保编译器设置正确。随后编写测试代码,例如加载和显示图片,并进行编译运行。完成这些步骤后,你就能在QtCreator中利用OpenCV进行图像处理开发了。
198 6
|
5月前
|
计算机视觉
【轻松入门】OpenCV4.8 + QT5.x开发环境搭建
【轻松入门】OpenCV4.8 + QT5.x开发环境搭建
76 0
【轻松入门】OpenCV4.8 + QT5.x开发环境搭建
|
5月前
|
机器学习/深度学习 监控 算法
OpenCV一文入门
OpenCV 是一个开源的计算机视觉库,用于图像处理、视频分析和机器学习。它包含数千种算法,涉及滤波、几何变换、特征检测、机器学习等多个领域。支持图像和视频读取、显示、处理,例如图像转灰度、高斯模糊和边缘检测。安装 Python 版本可通过 `pip install opencv-python`。OpenCV 广泛应用于自动驾驶、安防监控、医疗影像和制造业等,未来将加强深度学习支持和跨平台性能。
57 0
|
6月前
|
计算机视觉 索引 Python
分析”圣诞帽“代码,入门OpenCV
分析”圣诞帽“代码,入门OpenCV
分析”圣诞帽“代码,入门OpenCV
|
6月前
|
存储 算法 C语言
OpenCV 即时入门(全)
OpenCV 即时入门(全)
113 0