记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。
openv官方提供的示例程序:具体位于..\opencv\sources\samples\cpp
..\opencv\sources\samples\cpp\tutorial_code
路径下存放着和官方教程配套的示例程序
可以自己动手运行一下官方的示例程序,书上的有的具体地址都没给。
程序的用法是根据鼠标框选区域的色度光谱来进行摄像头读入的视频目标的跟踪。
详见目录:..\opencv\sources\samples\cpp\camshiftdemo.cpp
光流法是目前运动图像分析的重要方法,包含了目标运动信息。
只有官方demo运行图,没有具体地址。
程序运行后,会自动启用摄像头没,这时按键盘上的"r"键来启动自动点跟踪,便可以看到如图2.7所示的效果图。而我们在摄像头中移动物体,可以看到物体上的点随着物体一同移动,如图2.8所示。
详见目录:..\opencv\sources\samples\cpp\lkdemo.cpp
运行程序,将自己的脸对准摄像头,或者放置一张照片对准摄像头任其捕获,便可以发现程序准确地识别出了人脸,并用彩色的圆将脸圈出。
详见目录:..\opencv\sources\samples\cpp\tutorial_code\objectDetection
还需要将..\opencv\sources\data\haarcascades
路径下的haarcascade_eye_tree_eyeglasses.xml
和haarcascade_frontalface_alt.xml
复制到和源文件同一目录下,才能正确运行。
相机不好使…效果图如书上所示:
只有官方demo运行图,没有具体地址。
第一个程序是使用CvSVM::train函数训练一个SVM分类器。
第二个程序主要用于讲解在训练数据线性不可分时,如何定义支持向量机的最优化问题。
官网下载地址:https://cmake.org/
打开:点击快捷方式或进入安装路径D:\software\CMake\bin
,找到cmake-gui.exe运行。
D:/software/opencv/sources
(opencv安装时源代码的存储路径)D:/programming/opencv/Solution
(自定义路径)
点击finish就会生成对应的VS2010的sln解决方案。
看到进度条读到最后,出现Configuring done就完成了。
打开"OpenCV.sln"解决方案包含67个项目的解决方案
可以点击任意一个我们感兴趣的项目,查看源代码并调试。
opencv.hpp包含了OpenCV各模块的头文件。
#ifndef __OPENCV_ALL_HPP__
#define __OPENCV_ALL_HPP__
#include "opencv2/core/core_c.h"
#include "opencv2/core/core.hpp"
#include "opencv2/flann/miniflann.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/photo/photo.hpp"
#include "opencv2/video/video.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/ml/ml.hpp"
#include "opencv2/highgui/highgui_c.h"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/contrib/contrib.hpp"
#endif
arg指的是参数
//官方最标准的main函数写法:
int main(int argc,char *argv[])
{
const char* imagename = argc > 1 ? argv[1] : "lena.jpg";
......
}
int main(int argc,char *argv[],char **env)
参数1:int类型的argc,为整型。用来统计运行程序时送给main函数的命令行参数的个数,在Visual Studio中默认值为1。
参数2:char*类型的argv[],为字符串数组,用来存放指向字符串参数的指针数组,各成员含义如下:
参数3:char **类型的env,为字符串数组。很少用。
1、【写法1】返回值为整型带参的main函数
int main(int argc,char** argv)
{
//函数体内使用或不使用argc和argv都可行
......
return 1;
}
2、【写法2】返回值为整型不带参的main函数
int main(int argc,char** argv)
{
//函数体内使用了argc或argv
......
return 1;
}
3、【写法3】返回值为void且不带参的main函数
int main()
{
......
return 1;
}
int printf(const char *format,...);
即:
int printf("格式控制字符串",输出表列);
示例:
#include
using namespace cv;
void main()
{
int a = 66,b = 88;
printf("\n\t%d,%d\n",a,b); //输出十进制整型
printf("\n\t%06d,%06d\n",a,b); //输出6位十进制整型
printf("\n\t%c,%c\n",a,b); //按字符输出
printf("\n\t结果为:a=%d,b=%d",a,b); //可以配合其他内容一同输出
getchar(); //等待输出任意字符结束
}
结果图:
#include
using namespace cv;
int main()
{
printf("\t当前使用的OpenCV版本为 OpenCV %s",CV_VERSION);
getchar();
}
最后的最后,很喜欢书中的一句话: