配置环境
-
环境变量 D:\opencv\opencv 3.4\build\x64\vc15\lib
-
新建项目
-
opencv\build\x64\vc15\bin下,复制
opencv_world440.dll
opencv_world440d.dll
opencv_videoio_ffmpeg440_64.dll
三个动态链接库到
C:\Windows\System32 路径下:
-
项目右键,属性。平台 x64 。配置管理器中修改平台 x64 .
-
点击VC ++ 目录, 点击包含目录,点击右边的下拉三角形,点击编辑,将如下目录输入即可,
opencv\build\include
opencv\build\include\opencv2
这表示,VC++ 会从此opencv 算法目录调用。
-
点击库目录,点击右边的下拉三角形,点击编辑,将如下目录输入即可,
E:\opencv\build\x64\vc15\lib
-
点击链接器,点击输入,点击附加依赖项,点击右边的下拉三角形,点击编辑,将如下目录输入即可,
opencv_world440d.lib
-
测试一下
# include
#includeusing namespace cv;int main(int argc, char** argv) {Mat image = imread("D:\\jupyter-notebook\\opencv\\5.jpg");if (image.empty()) {printf("could not load image...\n");return -1;}imshow("test_opencv_srtup", image);waitKey(0);return 0;}
opencv 初探
头文件
- #include “opencv2/core/core.hpp” 结构和数学运算
- #include“openc2/flann/minflann.hpp" 最近邻搜索匹配函数
- #include "opencv2/imporc/imgproc.hpp” 图像处理函数
- #include “opencv2/vide/photo.hpp" 操作和回复照片的相关算法
- #include “opencv2/video/video.hpp” 视觉追踪和背景分割
- #include “opencv2/features2d/features2d.hpp” 用于追踪的二维特征
- #include “opencv2/objdetect/objdetect.hpp” 级联分类器, latent SVM 分类器,HoG特征和平面片检测器
- #include “opencv2/calib3d/calib3d.hpp” 校准以及双目视觉
- #include “opencv2/ml/ml.cpp” 机器学习,聚类, 和模式识别有关
- #include “opencv2/highgui/highgui.hpp” 显示,滚动条,鼠标操作以及输入输出
- #include “opencv2/contrib/contirb.hpp” 皮肤检测,模糊的Mean-shift 追踪,spin image 算法和自相似特征等。
- 还有包括了全部的 #include “opencv2/opecv.hpp”
从一个小程序开始:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include
#include using namespace std;int g_slider_position = 0;
int g_run = 1, g_dontset = 0;
cv::VideoCapture g_cap;void onTrackbarSlide(int pos, void*) {g_cap.set(CV_CAP_PROP_POS_FRAMES, pos); if (!g_dontset) g_run = 1; g_dontset = 0;
}void main()
{cv::namedWindow("Example 2-4", cv::WINDOW_AUTOSIZE);g_cap.open("D:\\opencv\\sources\\samples\\data\\vtest.avi");int frames &#61; (int)g_cap.get(CV_CAP_PROP_FRAME_COUNT); int tmpw &#61; (int)g_cap.get(CV_CAP_PROP_FRAME_WIDTH);int tmph &#61; (int)g_cap.get(CV_CAP_PROP_FRAME_HEIGHT);cout << "Video has " << frames << " frames of dimensions("<< tmpw << ", " << tmph << ")." << endl;cv::createTrackbar( "Position","Example 2-4",&g_slider_position,frames,onTrackbarSlide);cv::Mat frame;for (;;) {if (g_run !&#61; 0) {g_cap >> frame;if (frame.empty()) break;int current_pos &#61; (int)g_cap.get(CV_CAP_PROP_POS_FRAMES); g_dontset &#61; 1;cv::setTrackbarPos("Position", "Example 2-4", current_pos);cv::imshow("Example 2-4", frame);g_run -&#61; 1;}char c &#61; (char)cv::waitKey(10);if (c &#61;&#61; &#39;s&#39;) { g_run &#61; 1;cout << "Single step, run &#61; " << g_run << endl;}if (c &#61;&#61; &#39;r&#39;) { g_run &#61; -1;cout << "Run mode, run &#61; " << g_run << endl;}if (c &#61;&#61; 27) break;}
}
c艹的代码量真多啊&#xff0c;没啥功能就要那么多行。
作为刚入c&#43;&#43; 深坑的萌新记录一下
argc和argv参数在用命令行编译程序时有用。main( int argc, char* argv[], char **env ) 中
- 第一个参数&#xff0c;int型的argc&#xff0c;为整型&#xff0c;用来统计程序运行时发送给main函数的命令行参数的个数&#xff0c;在VS中默认值为1。
- 第二个参数&#xff0c;char*型的argv[]&#xff0c;为字符串数组&#xff0c;用来存放指向的字符串参数的指针数组&#xff0c;每一个元素指向一个参数。各成员含义如下&#xff1a;
- argv[0]指向程序运行的全路径名
- argv[1]指向在DOS命令行中执行程序名后的第一个字符串
- argv[2]指向执行程序名后的第二个字符串
- argv[3]指向执行程序名后的第三个字符串
- argv[argc]为NULL
命令行中的使用就是&#xff08;WIN&#xff09;&#xff1a;"opencv c艹.exe" D:\opencv\sources\samples\data\vtest.avi
opencv的数据类型
-
固定向量类 Vec&#xff0c;用于已知维度的小型向量。相当于列为1 的Matx<> ,cv::Vec{2,3,4,6}{b,s,w,i,f,d}, w 无符号短整型。b 无符号字符型&#xff0c;s 短整型&#xff0c;i int &#xff0c;f,d 浮点类型
可以方便的通过单个数来索引。
-
Point 类&#xff0c;基本的模板结构表示任何类型的点&#xff08;二维三维&#xff09;。一般通过cv::Point2i cv::Point3f 这样的类型别名实例化&#xff0c;&#xff08;b无符号字符&#xff0c;s 短整型&#xff0c;i 32位整形&#xff0c;f 32位浮点数&#xff0c;d 64位浮点数&#xff0c;可以转换成固定向量类&#xff08;Vec)。
-
Scalar类&#xff0c;相当于(cv::Vec) &#xff0c;成员都是双精度浮点数&#xff0c;继承了向量代数操作&#xff0c;成员访问函数[] &#xff0c;和固定向量类的特性。使用的时候不一定传入四个值吧。。。
-
size 类&#xff0c;cv&#xff1a;&#xff1a;Size. cv&#xff1a;&#xff1a;Size2i. cv&#xff1a;&#xff1a;Size2f &#xff0c;前面两个是一样的。
与point 相比&#xff0c;这个的成员是 width, height &#xff0c;point 中是 x,y 。而且也不能转换成Vec。但point &#xff0c;Vec可以转化成 size类 。
-
Rect 类 包含了point 的成员 x,y &#xff08;左上角坐标&#xff09;和size的宽高。
-
RotatedRect 类&#xff0c;包含一个 Point2f,&#xff08;中心点&#xff09; Size2f and float 角度&#xff0c;
7. 固定矩阵 cv::Matx<> &#xff0c;维度要已知。适用于小型数组&#xff08;2*2&#xff0c;3*3&#xff09;&#xff0c;cv&#xff1a;&#xff1a;Matx{1,2&#xff0c;…{1,2&#xff0c;…}{f,d} &#xff0c;数字为1 - 6 。
8. 复数类&#xff0c;
9. cv::TermCriteria 类&#xff0c;封装终止条件的&#xff08;达到迭代次数&#xff0c;达到指定精度&#xff09;TermCriteria( int type, int maxCount, double epsilon )&#xff1b;type:cv::TermCriteria::COUNT or TermCriteria::EPS or | 一起使用
-
Range类&#xff0c;确定一个连续序列&#xff0c; cv::Range( int start, int end ). Range rng(0,4); rng.size(); rng.empty();
-
Ptr 模板和垃圾收集&#xff0c;就是指针p 的实例消失后&#xff0c;自动清除这个对象。cv::Ptr p( new cv::Matx33f ), or cv::Ptr p &#61; makePtr()
。得到一个智能指针 p&#xff0c; 可以像标准指针一样使用。但可以记录指向这个实例的个数&#xff0c;当指向实例的指针都释放了&#xff0c;这个实例就可以自动调用析构自动释放。
addref();release() 增加减少计数&#xff0c;empty() 判断指针释放指向了一个已经倍释放的对象&#xff0c;确定指向的对象是否为NULL 。delete_obj() 引用计数清零时自动执行的函数。
template<> inline void cv::Ptr<FILE>::delete_obj() {fclose(obj);
}
{cv::Ptr<FILE> f(fopen("myfile.txt", "r"));if(f.empty())throw ...; fprintf(f, ...);...
}
- Exception 类和异常处理&#xff0c;继承自std::exception
- cv::DataType<> 模板&#xff0c;再opencv函数中需要传递特定数据类型的概念时 &#xff0c;就创建一个datatype<>类型的对象。传递的实际上是这个模板的特化。看不懂&#xff0c;等以后用上了再研究吧。。。
template<typename _Tp> class DataType
{typedef _Tp value_type;typedef value_type work_type; typedef value_type channel_type; typedef value_type vec_type;enum {generic_type &#61; 1,depth &#61; -1,channels &#61; 1,fmt &#61; 0,type &#61; CV_MAKETYPE(depth, channels)};
};
另一个作用是与更复杂的结构实现交互&#xff0c;比如允许以传入数据类型无关的方式实现算法。
- 工具函数&#xff0c;包含数学操作&#xff0c;测试&#xff0c;错误生成&#xff0c;内存和线程处理&#xff0c;优化等其他工具。
计数事件时间&#xff0c;前后调用 cv::getTickCount() &#xff0c;然后相减除以 cv::getTickFrequency() 的返回值。