OpenCV学习笔记非打印版本

合集下载

Opencv2.4.6自带文档中文笔记(core)

Opencv2.4.6自带文档中文笔记(core)

2.1(一)Mat矩阵中数据指针Mat.data是uchar类型指针,CV_8U系列可以通过计算指针位置快速地定位矩阵中的任意元素。

二维单通道元素可以用Mat::at(i, j)访问,i是行序号,j是列序号。

但对于多通道的非unsigned char类型矩阵来说,以上方法都不好(注:后来知道可以通过类型转换,用指针访问data数据,见后文)。

可以用Mat::ptr()来获得指向某行元素的指针,在通过行数与通道数计算相应点的指针。

参照OpenCV的Mat::at()函数,写了一个访问二维Mat矩阵的两个简单的小函数,没有边界检查。

#include <opencv2/core/core.hpp>template<typename ItemType>ItemType* getMatPointPtr(cv::Mat & src, int i , int j , int c = 0){ItemType* curRow = src.ptr<ItemType>(i);return curRow + j * src.channels() + c;}template<typename ItemType>ItemType getMatPoint(cv::Mat & src, int i , int j , int c = 0){ItemType* curRow = src.ptr<ItemType>(i);return *(curRow + j * src.channels() + c);}OpenCV中的Mat::at()代码有严格的边界检测,Mat::ptr()也有边界检测,但代码中没有检测j是否越界。

以上为推荐使用的情况,下边的不推荐使用。

可以通过转换指针类型,访问非uchar类型的Mat元素。

例如:图像是CV_64FC1格式,可以将Mat.data指针直接转换成double*类型:// imgMat is a image.double* pimg = (double*)(imgMat.data)也可以用C++中的显式转换符static_cast,不过要通过void*类型过渡:void* pvoid = static_cast<void*>(imgMat.data);double* pimg = static_cast<double*>(pvoid);这种方式在Debug模式下速度提升非常显著,但没有任何的边界检查和异常处理,使用时必须十分小心。

OpenCV学习笔记(基于OpenCV 2.4)一:哈喽CV

OpenCV学习笔记(基于OpenCV 2.4)一:哈喽CV

原文地址:/archives/2632.htmlOpenCV学习笔记(基于OpenCV 2.4)一:哈喽CV0 写在最前面这份笔记主要记录自己一个简单的学习过程,此过程从OpenCV零基础开始到实现一个或若干个图像处理算法为止,中间可能会穿插部分自己遇到的比较典型的并认为需要记录的问题进行解析,每章节内容尽量做到简短而充实,方便学习及回顾。

此外,苦于很多初学者(我也是零基础)难以找到较新版本的OpenCV的中文学习资料或文档(旧版的1.X系列与2.X系列差距巨大,2.X是重构过的),因此,这份笔记也会针对OpenCV最新版官方文档(这里基于2.4.X版)里的一些基础内容进行翻译(相信大家走过了基础期,以后再读英文文档就不会那么费劲)。

笔者是国内某高校一小硕,研究方向为医学图像处理,将于2013年6月份毕业,因此,在2012年12月21世界末日到来之前,这份为零基础入门的学习笔记定会截稿,否则,小僧就毕不了业了。

当然,若干月后,小僧还会遇到类似的问题或发现笔记有不妥的地方,那么,小僧也会及时更新过来的。

摘要:本文主要在以下几个方面做介绍:1) OpenCV简介,什么是OpenCV;2) OpenCV的模块结构;3) OpenCV的下载、安装、配置及使用;4)OpenCV版HelloWorld代码及详解;关键词:OpenCV;OpenCV教程;OpenCV学习笔记;OpenCV中文教程;OpenCV下载;1 OpenCV简介OpenCV(Open Source Computer Vision)是一个用于实时处理的计算机视觉函数库,它基于BSD许可证授权并且可免费用于学术研究和商业应用。

它拥有C/C++、Python、和Java(仅用于Android)接口,并可在Windows、Linux、Mac和Android平台上运行。

OpenCV库包含大于2500个优化算法,拥有5M的下载量和47K+的用户群体。

opencv自学笔记

opencv自学笔记

OPENCV一、Opencv 基本架构分析多模块组合起来的一个软件开发工具包(SDK)1、【calib3d】2、【cntrib】3、【core】:核心功能模块。

4、【imgproc】:图像处理模块。

5、【features2d】6、【flann】7、【gpu】8、【highgui】:高层GUI图形用户界面,包含媒体的输入输出、视频捕捉、图像视频的编码和解码、图形交互界面的接口内容等。

9、【legacy】…二、HighGui图形用户界面初步1、opencv的命名空间:opencv的C++类和函数都是定义在命名空间cv之内的,访问方法:(1)、在代码开头的适当位置加上using namespace cv (2)、在使用opencv的每个内和函数时,都加入cv::命名空间。

2、图像的载入:imread()函数Mat imread(const string& filename, int flags=1);(1)、const string&类型的filename,填我们需要载入的图片路径名称。

(2)、int类型的flags,为载入标志,它指一个加载图像的颜色类型。

3、图像的显示:imshow()函数Void imshow(const string& winname, InputArray mat);(1)、const string&类型的winname,填需要显示的窗口标识名称。

(2)、InputArray类型的mat,填需要显示的图像。

4、创建窗口:namedWindow()函数void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE);(1)、const string&类型的name,填写被作用窗口的标识符的窗口名称。

(2)、int类型的flags,窗口的标识,可填写WINDOW_AUTOSIZE、WINDOW_NORMAL或WINDOW_OPENGL5、输出到文件:imwrite()函数bool imwrite(const string& finename, InputArray img , const vector<int>& params=vector<int>() );(1)、const string&类型的finename,填需要写入的文件名。

基础学习笔记之opencv:直方图使用学习

基础学习笔记之opencv:直方图使用学习

目的:直方图在cv领域到处可见,因为其功能在cv算法的实现中必不可少。

Opencv库中也集成了关于直方图的不少函数,比如直方图的计算,均衡,归一化,相似度比较等等。

为了体验这些函数,做了个小实验,功能是:打开摄像头,鼠标选定一个框,框内图像作为标准图像,计算出其直方图并显示出来;然后继续鼠标选定框,该框内的图像的直方图与标准图像的进行相似度计算,计算结果在终端输出,数值越大表示相似度越大。

工程环境:opencv2.3.1+vs2010。

工程代码:1// hist_test.cpp : 定义控制台应用程序的入口点。

2//34 #include "stdafx.h"5 #include <opencv2/core/core.hpp>6 #include <opencv2/imgproc/imgproc.hpp>7 #include <opencv2/highgui/highgui.hpp>8 #include <iostream>9 #include <stdio.h>1011usingnamespace cv。

12usingnamespace std。

1314int nFrame_num=0。

15bool pause=false。

16bool tracking=false。

17 Rect preselectROI,selectROI。

//用于存放手选的矩形18bool comp=true。

1920Mat rhist,ghist,bhist。

21int channels[]={0,1,2}。

22//const int histsize[]={256,256,256}。

23constint histsize[]={16,16,16}。

24constint histsize1=16。

25float rranges[]={0,255}。

OpenCV 经典笔记

OpenCV 经典笔记

Opencv 中 open 为openSource ,CV为computer Vision计算机视觉Opencv特征:1.开源计算机视觉库采用C/C++编写2.目的是开发实时应用程序3.独立于操作系统、硬件和图形管理器4.具有通用的图像、视频载入,保存和获取模块5.具有底层和高层的应用开发包Opencv目标:为解决计算机视觉问题提供基本工具基本组成:高层函数、基本函数Opencv模块(主要)1、CV 主要的OpenCV函数:图像处理与视觉算法2、ML 机器学习、模式分类和回归分析,统计分离器3、HighGUI 图像视频输入/出4、CXcore 数据结构与线性代数支持,基本函数常用的视频处理:彩色跟踪,点跟踪,动运分割,边缘检测常用的图像处理:边缘检测,分割,形态学操作,直方图,距离变换,椭圆拟合命名规则:1.通用矩阵数据类型 :CV_(位数)(S|U|F)C(通道数) ---位数也叫作深度S:带符,U:无符,F:浮点, CV_32FC2 :32位浮点数双通道矩阵 2.通用图像数据类型:IPL_DEPTH_(位数)( S|U|F)IPL_DEPTH_8U :8位无符号整数图像一、基础知识1.基础数据结构1.1. CvPointCvPoint 二维坐标系下的点,类型为整型typedef struct CvPoint{int x; /* X坐标, 通常以0为基点 */int y; /* y坐标, 通常以0为基点 */}1.2. CvSize 矩形框大小,以像素为精度typedef struct CvSize{int width; /* 矩形宽 */int height; /* 矩形高 */}1.3.CvRect 矩形框的偏移和大小typedef struct CvRect{int x; /* 方形的最左角的x-坐标 */int y; /* 方形的最上或者最下角的y-坐标 */int width; /* 宽 */int height; /* 高 */}1.4. CvScalar 定义存放1- 4个数值的数组。

OpenCV学习笔记(一)

OpenCV学习笔记(一)

OpenCV学习笔记(一)摘要:由于最近AR(增强现实)这个概念非常火爆,各种基于AR的应用及游戏逐渐面向大众,而在AR中最重要的两个技术就是跟踪识别和增强渲染,其中跟踪识别是通过OpenCV这个开源的计算机视觉库来实现的,所以我就想着研究一下这个库,这里是个人的学习笔记,不是什么权威的教程,如果你们有错误也麻烦帮我指出哈。

====================================== =======分割线========================================= =========前言:什么是OpenCV?可能还有人不清楚吧,简单地说,OpenCV——Open Source Computer Vision Library,即开源计算机视觉库,它是基于C语言和部分C++语言来开发,可用于计算机视觉、图像处理以及模式识别和跟踪。

一、准备工作:1.下载OpenCV安装包:到OpenCV的官网()下载最新版本的OpenCV安装包,由于OpenCV针对不同平台都有安装程序,所以我们只需要根据当前开发环境选择合适的平台版本即可,这里我们是在win7 64bit操作系统下进行开发,所以应该下载OpenCV for Windows:我们选择了当前的最新版本3.1,下载完毕后,我们得到其安装文件:opencv-3.1.0.exe2.安装Visual Studio 2015二、安装配置:1.安装:双击打开下载好的opencv-3.1.0.exe文件,进行安装(其实是解压),选择安装目录:安装完毕之后,在其安装目录下可以看到两个文件夹:build和sources,其中build是OpenCV使用时要用到的一些库文件,而sources中则是OpenCV为我们提供的一些demo示范源码:2.环境变量配置:上面步骤只是完成了安装,但是要能够正常使用OpenCV来进行开发,我们还需要进行环境变量的配置,我的电脑—>属性—>高级系统设置—>环境变量,找到Path变量,选中并点击编辑:64位系统的需要在path添加“;opencv安装路径\build 64\vc14\bin”(注:英文输入法中的“;”是分割符,用于与前面其他软件的配置参数分开),例如我的配置参数应该为:;E:\OpenCV\opencv\build 64\vc14\bin。

OpenCV学习小结

OpenCV学习小结

OpenCV学习总结
数字图像处理1—90页笔记
数字图像基础
1、处理图像步骤:图像获取、图像增强、复原、彩色处理、小波变换、压缩、形态学处理(前面步骤输出图像);分割、表示与描述(即特征提取)、对象识别(后面步骤输出图像属性)。

2、图像是由“照射”源和形成图像“场景”元素对光能的反射或吸收相结合而成。

3、传感器获取图像,输出连续变化的电压,然后取样、量化为数字图像。

4、数字图像可矩阵表示,矩阵中的值取整数,表示图像灰度值,出于处理方便,灰度级典型的取值为2的整数次幂L=2k,通常称为K比特图像。

空间域图像增强
1、当要增强图像暗色区域的白色或灰色细节,当黑色面积占主导地位时,可用图像反转变换增强图像。

2、当要压缩图像像素的动态范围,可采用对数变换,典型应用是傅里叶频谱的压缩。

3、监视器上图像校正,通常称为伽马校正,可用幂次变换。

4、对比拉伸的思想是提高图像处理时灰度级的动态范围,提高图像对比度。

5、灰度切割:在图像中提高特定灰度的亮度。

6、位图切割:对特定位提高亮度。

7、直方图均衡化作用,使灰度级分布趋于均匀,因为图像像素直方图分布均匀,图像有高的对比度和多变的灰度色调。

8、平均值和方差在图像增强的作用是:对整幅图像进行度量,并对整幅图像和对比度进行初步调整。

9、“与”、“或”通常用作模板,模板可以提取一副图像中的图像,处理感兴趣(ROI)区域。

10、“非”操作与反变换操作功能相同。

11、图像相减可以比较两幅图像的差异,最成功的例子是在医学领域称为掩模式X光成像法。

opencv知识点总结

opencv知识点总结

opencv知识点总结1. 图像处理基础图像处理是OpenCV的核心功能之一。

OpenCV提供了丰富的图像处理算法,包括图像的读取、保存、显示、缩放、旋转、灰度化、滤波、边缘检测、直方图均衡化等。

使用OpenCV可以对图像进行各种处理操作,满足不同需求。

2. 特征检测与描述特征检测与描述是计算机视觉领域的重要研究内容,OpenCV提供了多种特征检测与描述算法,如SIFT(尺度不变特征变换)、SURF(速度加速特征)、ORB(Oriented FASTand Rotated BRIEF)等。

这些算法可以用于在图像中检测关键点,并对这些关键点进行描述,从而实现图像的特征匹配和识别。

3. 目标跟踪与运动估计目标跟踪与运动估计是在视频处理中经常遇到的问题。

OpenCV提供了多种目标跟踪算法,如基于光流的运动估计算法、卡尔曼滤波器等。

这些算法可以用于在视频中跟踪移动目标,并估计目标的运动轨迹。

4. 三维重建与立体视觉三维重建与立体视觉是计算机视觉领域的重要研究方向,OpenCV提供了多种三维重建和立体视觉算法,如立体匹配算法、三维点云重建算法、立体标定算法等。

这些算法可以用于对多张图像进行立体匹配,重建出三维场景的结构。

5. 目标识别与分类目标识别与分类是计算机视觉的经典问题,OpenCV提供了多种目标识别和分类算法,如Haar特征级联分类器、HOG(方向梯度直方图)特征分类器、深度学习模型等。

这些算法可以用于在图像中检测和识别出特定目标,如人脸、车辆、物体等。

6. 机器学习与模式识别OpenCV还提供了多种机器学习和模式识别算法,如支持向量机(SVM)、K均值聚类、决策树、随机森林等。

这些算法可以用于对图像数据进行分类、聚类、回归等任务,实现图像的智能识别和分析。

7. 深度学习与神经网络随着深度学习技术的兴起,OpenCV也提供了对深度学习和神经网络的支持。

OpenCV对多种深度学习框架(如TensorFlow、PyTorch)进行了整合,并提供了神经网络模型的导入、预测、微调等功能。

OpenCV3编程入门(毛星云)读书笔记(一)

OpenCV3编程入门(毛星云)读书笔记(一)

OpenCV3编程⼊门(⽑星云)读书笔记(⼀)开始cv版本2.4.9编译器vs2019资料书:OpenCV3编程⼊门(⽑星云)配置按照⽹上教程。

遇到的问题运⾏测试程序遇到的问题:OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file ........\opencv\modules\highgui\src\window.cpp, line 261原因是由于图⽚的地址错误。

图⽚应该存在项⽬下。

测试程序#include <opencv2/opencv.hpp>using namespace cv;int main() {/*Mat img = imread("1.jpg");*///这⾥的图⽚存在项⽬下(⽂件中)Mat img = imread("D:\\cv\\opencv_demo\\1.jpg");//注意地址间是\\imshow("[载⼊的图⽚]", img);waitKey(6000);}在运⾏过程中,如果出现XXX未定义等情况,最好将cv删掉重新解压使⽤简单⼏个例⼦1、图像腐蚀⽤暗⾊部分腐蚀掉图⽚中的亮⾊部分#include <opencv2/opencv.hpp>using namespace cv;//图⽚腐蚀int main() {Mat scrimage = imread("1.jpg");imshow("原图", scrimage);//腐蚀操作Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));Mat dstImage;erode(scrimage, dstImage, element);//进⾏图像腐蚀imshow("效果图", dstImage);waitKey();return 0;}2、图像模糊#include <opencv2/opencv.hpp>using namespace cv;//图⽚模糊int main() {Mat scrImage = imread("1.jpg");imshow("原图", scrImage);Mat dstImage;blur(scrImage, dstImage, Size(7, 7));//图⽚模糊imshow("效果图", dstImage);waitKey();}3、canny边缘检测载⼊图像,先转为灰度图,再⽤blur进⾏图⽚模糊降噪,⽤canny进⾏边缘检测#include <opencv2/opencv.hpp>using namespace cv;//图⽚边缘检测int main() {Mat srcImage = imread("2.jpg");imshow("原图", srcImage);Mat dstImage,edge,grayImage;dstImage.create(srcImage.size(), srcImage.type());//设置和原图⼀样的矩阵cvtColor(srcImage, grayImage, CV_BGR2GRAY);//在dstImage矩阵上⽣成图blur(grayImage, edge, Size(3, 3));Canny(edge, edge, 3, 9, 3);imshow("效果图", edge);waitKey();return 0;}4、读取并播放视频#include <opencv2\opencv.hpp>using namespace cv;int main(){VideoCapture capture("1.avi");//存储位置相同while(1){Mat frame;capture>>frame;imshow("读取视频",frame);waitKey(30);}return 0;}5、截取摄像头图像并canny处理#include <opencv2/opencv.hpp>using namespace cv;int main() {VideoCapture capture(0);//表⽰使⽤摄像头Mat edges;while (1) {Mat frame;capture >> frame;cvtColor(frame, edges, CV_BGR2GRAY);blur(edges, edges, Size(7, 7));Canny(edges, edges, 0, 30, 3);imshow("结果", edges);if (waitKey(30) >= 0) {break;}}return 0;}//输出当前cv版本printf("\t版本 OpenCV" CV_VERSION);HighGUI图形⽤户界⾯初步cv2开始使⽤Mat为数据类型进⾏图像存取图像的载⼊、显⽰及输出imread()读取⽂件中的图像Mat imread(const string& filename,int flags=1);const string&filename:填⼊图⽚的路径名int flags:载⼊标识,指定加载图像的颜⾊类型。

OpenCV学习笔记(2):Mat矩阵的初始化和元素访问

OpenCV学习笔记(2):Mat矩阵的初始化和元素访问

OpenCV学习笔记(2):Mat矩阵的初始化和元素访问在研究Mat矩阵的初始化的时候,发现其不能像Matx轻量级矩阵那样,直接利⽤数组来进⾏初始化,⽽是利⽤⼀个内部的变量类型:Scalar来进⾏初始化的。

参考⼿册中的构造函数如下所⽰:(1) Mat::Mat()(2) Mat::Mat(int rows, int cols, int type)(3) Mat::Mat(Size size, int type)(4) Mat::Mat(int rows, int cols, int type, const Scalar& s)(5) Mat::Mat(Size size, int type, const Scalar& s)(6) Mat::Mat(const Mat& m)(7) Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)(8) Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)(9) Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange)(10) Mat::Mat(const Mat& m, const Rect& roi)(11) Mat::Mat(const CvMat* m, bool copyData=false)(12) Mat::Mat(const IplImage* img, bool copyData=false)(13) template<typename T, int n> explicit Mat::Mat(const Vec<T, n>& vec, bool copyData=true)(14) template<typename T, int m, int n> explicit Mat::Mat(const Matx<T, m, n>& vec, bool copyData=true)(15) template<typename T> explicit Mat::Mat(const vector<T>& vec, bool copyData=false)(16) Mat::Mat(const MatExpr& expr)(17) Mat::Mat(int ndims, const int* sizes, int type)(18) Mat::Mat(int ndims, const int* sizes, int type, const Scalar& s)(19) Mat::Mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0)(20) Mat::Mat(const Mat& m, const Range* ranges)似乎这样的矩阵让我们⽤起来感觉很不顺⼿,不过接着往下读参考⼿册,你会发现这样⼀个例⼦:Mat H(100, 100, CV_64F);for(int i = 0; i < H.rows; i++)for(int j = 0; j < H.cols; j++)H.at<double>(i,j)=1./(i+j+1);通过这个例⼦,我们尝试来给Mat类型初始化。

个人整理的opencv最基本入门资料

个人整理的opencv最基本入门资料

个人整理的opencv最基本入门资料OpenCV最基本入门资料OpenCV(Open Source Computer Vision Library)是一个功能强大的开源计算机视觉库,用于处理图像和视频。

它提供了丰富的图像处理和计算机视觉算法,使开发者能够快速构建各种视觉应用程序。

本文将为您提供一份个人整理的OpenCV最基本入门资料,帮助您快速入门并了解OpenCV的基本概念和使用方法。

一、OpenCV简介OpenCV是跨平台的计算机视觉库,最初由英特尔公司于1999年开发并发布。

它包含了超过2500个优化的算法,涵盖了图像处理、特征提取、目标检测、机器学习等领域。

OpenCV支持多种编程语言,包括C++、Python、Java等,且具有良好的兼容性和扩展性。

二、安装OpenCV在开始学习OpenCV之前,首先需要安装OpenCV库。

下面是安装OpenCV的基本步骤:1.下载OpenCV:在OpenCV官方网站(不提供链接,请自行搜索)上下载适合您操作系统的OpenCV版本,并解压缩到本地目录。

2.配置环境变量:将OpenCV所在目录添加到系统的环境变量中,以便系统能够正确找到OpenCV库文件。

3.配置IDE:如果使用集成开发环境(IDE)进行开发,还需要配置IDE以正确链接和使用OpenCV库。

三、OpenCV基本概念在使用OpenCV之前,需要了解一些基本的概念:1.图像表示:OpenCV中的图像使用多维数组来表示,可以是二维的灰度图像,也可以是三维的彩色图像。

了解图像的表示方式有助于理解后续的图像处理操作。

2.像素操作:像素是图像的最基本单元,每个像素都包含了图像上某个位置的颜色信息。

OpenCV提供了各种像素操作函数,可以获取、设置、修改像素的值。

3.图像处理:OpenCV提供了丰富的图像处理函数,包括滤波、边缘检测、直方图均衡化等。

通过这些函数,可以对图像进行各种操作,实现图像的增强、降噪、特征提取等功能。

opencv知识点

opencv知识点

OpenCV知识点1. 简介OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了一系列用于处理图像和视频的函数和工具。

OpenCV最初由Intel开发,并于2000年首次发布。

目前,OpenCV已经成为计算机视觉领域最受欢迎和广泛使用的库之一。

2. 图像处理2.1 图像读取与显示使用OpenCV可以轻松地读取和显示图像。

下面是一个简单的示例代码:import cv2# 读取图像img = cv2.imread('image.jpg')# 显示图像cv2.imshow('Image', img)cv2.waitKey(0)cv2.destroyAllWindows()2.2 图像缩放与裁剪OpenCV提供了丰富的函数来处理图像的缩放和裁剪。

下面是一些常用的函数:•resize():调整图像大小。

•crop():裁剪图像。

import cv2# 缩放图像resized_img = cv2.resize(img, (new_width, new_height))# 裁剪图像cropped_img = img[y:y+h, x:x+w]2.3 图像滤波滤波是一种常用的图像处理技术,用于去除噪声、平滑图像以及检测边缘等。

OpenCV提供了多种滤波方法,如均值滤波、高斯滤波、中值滤波等。

import cv2# 均值滤波blurred_img = cv2.blur(img, (ksize, ksize))# 高斯滤波blurred_img = cv2.GaussianBlur(img, (ksize, ksize), sigma)# 中值滤波blurred_img = cv2.medianBlur(img, ksize)2.4 边缘检测边缘检测是图像处理中的重要任务之一。

OpenCV提供了多种边缘检测算法,如Sobel算子、Canny边缘检测等。

OpenCV基础知识学习--第三弹

OpenCV基础知识学习--第三弹

OpenCV基础知识学习--第三弹------------恢复内容开始------------获取图像像素指针CV_Assert(myImage.depth() == CV_8U )Mat.ptr<uchar> (int i=0) 获取像素矩阵的指针,索引 i 表⽰第⼏⾏,从 0 开始计⾏数获得当前⾏指针 const uchar *current = myImage.ptr<uchar>(row)获取当前像素点 p (row,col) 的像素值 p(row,col) = current[col]像素范围处理 saturate_cast<uchar>saturate_cast<uchar>(-100) 返回 0saturate_cast<uchar>(288)返回 255saturate_cast<uchar>(100)返回 100这个函数的功能是确保 RGB 值的范围在 0-255 之间图像像素的运算操作加法:add(m1, m2, img);减法:subtract(m1, m2, img);乘法:multiply(m1,m2,img);除法:divide(m1, m2, img);参数1:进⾏运算的图像1参数2:进⾏运算的图像2参数3:运算结果输出的图像滚动条操作int createTrackbar(const String& trackbarname, const String& winname,int* value, int count,TrackbarCallback onChange = 0,void* userdata = 0);createTrackbar("Value", "滚动条", &lightValue,maxValue,onTrack);参数1:滚动条名称参数2:滚动条所在的窗⼝名称参数3:随滚动条改变的数值变量参数4:滚动条数值改变的最⼤值(最⼩值默认 0)参数5:响应滚动条数值改变的函数参数6:附加传递的参数(任意类型)图像位运算bitwise_and(InputArray src1, InputArray src2,OutputArray dst, InputArray mask = noArray());参数1:进⾏运算的图像1参数2:进⾏运算的图像2参数3:输出结果的图像bitwise_and(m1,m2,img);imshow( "与运算", img);bitwise_or(m1, m2, img);imshow( "或运算", img);bitwise_xor(m1, m2, img);imshow( "异或运算", img);bitwise_not(m2, img);imshow( "⾮运算", img);使⽤ rectangle 绘制图像rectangle(InputOutputArray img, Rect rec,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);参数1:要进⾏绘制的图像参数2:要绘制的⼤⼩参数3:图像的颜⾊参数4:选择填充还是描边操作 <0 填充 >0描边参数5:线型类型参数6:对中⼼坐标和半径值中的⼩数位进⾏移位。

OpenCV计算机视觉库学习教程

OpenCV计算机视觉库学习教程

OpenCV计算机视觉库学习教程第一章:介绍OpenCV计算机视觉库1.1 OpenCV计算机视觉库的定义1.2 OpenCV历史和发展1.3 OpenCV的特点和应用领域第二章:安装和配置OpenCV2.1 下载和安装OpenCV库2.2 配置OpenCV环境变量2.3 集成OpenCV到IDE中第三章:基本图像处理操作3.1 图像读取和显示3.2 图像的保存3.3 图像的像素操作3.4 图像的缩放和裁剪3.5 图像的旋转和翻转3.6 图像的通道分离和合并第四章:图像滤波和增强4.1 均值滤波器4.2 高斯滤波器4.3 中值滤波器4.4 边缘增强算法4.5 图像锐化算法4.6 图像直方图均衡化第五章:形态学图像处理5.1 腐蚀和膨胀操作5.2 开运算和闭运算5.3 形态学梯度5.4 顶帽和黑帽运算5.5 图像的细化和粗化第六章:边缘检测和特征提取 6.1 Sobel算子和Scharr算子 6.2 Canny边缘检测6.3 Laplacian算子6.4 Harris角点检测6.5 FAST特征检测第七章:形状识别和计算机视觉算法7.1 轮廓检测和绘制7.2 多边形逼近7.3 直线和圆检测7.4 模板匹配算法7.5 特征匹配算法7.6 目标跟踪和运动检测第八章:机器学习和深度学习在OpenCV中的应用8.1 机器学习算法概述8.2 OpenCV中的机器学习模块8.3 监督学习:支持向量机(SVM)和决策树8.4 无监督学习:k均值聚类8.5 深度学习:卷积神经网络(CNN)和循环神经网络(RNN)第九章:计算机视觉应用示例9.1 图像分类与识别9.2 目标检测和跟踪9.3 人脸识别和表情分析9.4 视频分析和动作识别9.5 图像分割和场景理解第十章:其他资源和进阶学习10.1 官方文档和在线教程10.2 开源项目和示例代码10.3 计算机视觉相关书籍推荐10.4 学术论文和研究成果10.5 参考文献和扩展阅读通过以上章节的学习,读者将能够全面了解OpenCV计算机视觉库的基础知识和应用技巧。

《OpenCV计算机视觉编程攻略(第3版)》读书笔记模板

《OpenCV计算机视觉编程攻略(第3版)》读书笔记模板

7.1简介 7.2用Canny算子检测图像轮廓 7.3用霍夫变换检测直线 7.4点集的直线拟合 7.5提取连续区域 7.6计算区域的形状描述子
8.1简介 8.2检测图像中的角点 8.3快速检测特征 8.4尺度不变特征的检测 8.5多尺度FAST特征的检测
9.1简介 9.2局部模板匹配 9.3描述并匹配局部强度值模式 9.4用二值描述子匹配关键点
OpenCV计算机视觉编程攻略(第3版)
读书笔记模板
01 思维导图
03 目录分析 05 精彩摘录
目录
02 内容摘要 04 读书笔记 06 作者介绍
思维导图
本书关键字分析思维导图
视觉
函数
区域
计算机
简介
视觉
特征
第版
图像
内容 图像
目标
编程
第章

像素
视频
算法
投影
内容摘要
本书结合C++和OpenCV全面讲解计算机视觉编程,不仅涵盖计算机视觉和图像处理的基础知识,而且通过完 整示例讲解OpenCV的重要类和函数。主要内容包括OpenCV库的安装和部署、图像增强、像素操作、图形分析等各 种技术,并且详细介绍了如何处理来自文件或摄像机的视频,以及如何检测和跟踪移动对象。第3版针对OpenCV 最新版本进行了修改,调整了很多函数和算法说明,还增加了立体图像深度检测、运动目标跟踪、人脸识别、人 脸定位、行人检测等内容,适合计算机视觉新手、专业软件开发人员、学生,以及所有想要了解图像处理和计算 机视觉技术的人员学习参考。
3.1简介 3.2用策略设计模式比较颜色 3.3用GrabCut算法分割图像 3.4转换颜色表示法 3.5用色调、饱和度和亮度表示颜色

opencv4应用开发入门进阶与工程化实践 pdf

opencv4应用开发入门进阶与工程化实践 pdf

opencv4应用开发入门进阶与工程化实践pdf标题:OpenCV4应用开发入门进阶与工程化实践引言概述:OpenCV是一个开源的计算机视觉库,广泛应用于图像和视频处理领域。

本文将介绍OpenCV4应用开发的入门进阶与工程化实践,并提供相关资源的PDF下载。

正文内容:一、OpenCV4入门1.1 安装OpenCV4:介绍如何下载、安装和配置OpenCV4的步骤,包括安装依赖项、编译源代码等。

1.2 OpenCV4基础知识:介绍OpenCV4的基本概念和常用函数,如图像加载、图像处理、特征提取等。

二、OpenCV4进阶2.1 图像处理与分析:详细讲解OpenCV4中的图像处理算法,如滤波、边缘检测、图像分割等。

2.2 特征提取与匹配:介绍OpenCV4中的特征提取和匹配算法,如SIFT、SURF、ORB等。

2.3 目标检测与跟踪:讲解OpenCV4中的目标检测和跟踪算法,如Haar特征级联分类器、卡尔曼滤波器等。

三、OpenCV4工程化实践3.1 图像处理应用开发:详细介绍如何使用OpenCV4开发图像处理应用,包括图像滤波、边缘检测、图像分割等。

3.2 视频处理应用开发:介绍如何利用OpenCV4开发视频处理应用,包括视频读取、视频帧处理、视频保存等。

3.3 实时目标检测应用开发:讲解如何使用OpenCV4实现实时目标检测应用,包括目标检测模型加载、摄像头读取、目标跟踪等。

总结:本文介绍了OpenCV4应用开发的入门进阶与工程化实践。

通过学习OpenCV4的安装与基础知识,读者可以快速入门。

进阶部分涵盖了图像处理与分析、特征提取与匹配以及目标检测与跟踪等内容,帮助读者深入了解OpenCV4的高级功能。

工程化实践部分提供了图像处理、视频处理和实时目标检测应用开发的详细指导,帮助读者将所学知识应用到实际项目中。

读者可以通过下载相关资源的PDF来进一步学习和实践。

希望本文能够帮助读者快速入门OpenCV4应用开发,并在实践中获得更多的经验和技能。

opencv3编程入门学习笔记(一):基本函数介绍

opencv3编程入门学习笔记(一):基本函数介绍

opencv3编程⼊门学习笔记(⼀):基本函数介绍滤波blur (均值滤波)均值滤波是典型的线性滤波算法,主要⽅法为领域平均法(即⽤⼀⽚图像区域的各个像素的平均值来代替原图像中的各个像素值)缺点:不能很好的保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从⽽使图像变得模糊。

函数原型:void blur(InputArray src, OutputArrary dst, Size ksize , Point anchor=Point(-1, -1), int borderType = BORDER_DEFAULT)ksize : 核⼤⼩(kerneal size ),有点类似卷积核阈值化阈值可以被视为最简单的图像分割⽅法(基于图像中物体与背景之间的灰度差异)。

为了从图像中提取我们需要的部分,应该⽤图像中的每⼀个像素点的灰度值与选取的阈值进⾏⽐较,并进⾏相应的判断。

⼀旦找到了需要分割的物体的像素点,可以对这些像素点设定⼀些特定的值来表⽰。

可以将物体的像素点的灰度值设为 ”0“ (⿊⾊),其他像素点的灰度值为 ”255“ (⽩⾊)threshold (固定阈值操作)对灰度图像进⾏阈值操作,得到⼆值图像double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)src: 输⼊单通道数组dst: 处理后的结果thresh: 阈值的具体值maxval: 当像素值满⾜条件时,给该像素赋的值type : CV_THRESH_BINARY 、CV_THRESH_BINARY、CV_THRESH_BINARY_INVfindContours(InputArray img, OutputArray conours, OutputArray hierarchy, int mode, int method, Point offset=Point())img: 输⼊图像,需要为8 位单通道图像contours: 每个轮廓为⼀组点向量hierarchy:mode: 轮廓检索模式,。

OpenCV文献阅读笔记

OpenCV文献阅读笔记

——《基于LabVIEW机器视觉的产品检测平台设计与应用》1.机器视觉(CV)系统和科学图像处理分析系统(IPAS)。

2.机器视觉就是用机器代替人眼来做测量和判断。

机器视觉系统是指通过机器视觉产品(即图像摄取装置)将被摄取目标转换成图像信号,传送给专用的图像处理系统,根据像素分布和亮度、颜色等信息,转变成数字化信号;图像系统对这些信号进行各种运算来抽取目标的特征,进而根据判别的结果来控制现场的设备动作。

D(Charge-coupled Device 电荷耦合元件),一种能够把光学影像转化为电信号的半导体器件。

4. LabVIEW的一个程序由一或多个虚拟仪器(VI)组成,每一个VI都由三个主要部分组成:前面板、框图和图标。

前面板是VI的交互式用户界面;框图是VI的源代码,由LabVIEW的图形化编程语言构成;图标是VI的图形表示,可以在另外的VI框图中作为一个对象使用。

5.VI程序设计:前面板设计:前面板由输入、输出控制和显示构成。

输入量成为控件,输出量称为指示器。

框图设计:框图程序由端口、节点、图框和数据连线组成。

端口用于与程序前面板的控件和指示器传递数据,节点用于实现函数和功能调用,图框用于实现结构化程序控制命令,数据连线代表程序执行过程中的数据流,且定义了框图内的数据流动方向。

图标设计:图标把VI变成一个SubVI,像子程序一样在其它程序中调用。

——《基于OpenCV的图像处理》1. OpenCV处理图像包括以下几个步骤:加载图像;显示图像;处理图像。

——《基于OPENCV的计算机视觉技术研究》1. OpenCV(Open Source Computer Vision Library)是一个跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。

它轻量级而且高效——由一系列C 函数和少量C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

opencv学习笔记

opencv学习笔记

opencv学习笔记一、背景知识:(自己看这块的一些笔记)(1)数字电视的色彩空间和计算机不同,不是RGB空间,而是采用一个亮度信号(Y)和两个色差信号(R-Y、B-Y)的YUV空间或者叫YCbCr空间。

数字电视采用YUV(YCbCr)色彩空间的原因主要就是为了减少数据储存空间和数据传输带宽,同时又能非常方便的兼容黑白电视(R-Y和B-Y信号为零)(2)来源上的差异yuv色彩模型来源于rgb模型,该模型的特点是将亮度和色度分离开,从而适合于图像处理领域。

应用:basic color model used in analogue color TV broadcasting.YCbCr模型来源于yuv模型。

YCbCr is a scaled and offset version of the YUV color space.应用:数字视频,ITU-R BT.601 recommendation(3)YCbCr其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量。

人的肉眼对视频的Y分量更敏感,因此在通过对色度分量进行子采样来减少色度分量后,肉眼将察觉不到的图像质量的变化。

主要的子采样格式有 YCbCr 4:2:0、YCbCr 4:2:2 和 YCbCr 4:4:4。

(4)皮肤检测主要是根据肤色在颜色空间上的分布特征来检测图像中的肌肤区域。

利用颜色信息对皮肤检测,应为不同人的肤色在排除亮度、室环境等影响对肤色的影响,皮肤的色调基本一致。

因此可以利用颜色信息来进行皮肤检测。

YCbCr色彩模型被广泛应用在电视的色彩显示领域。

CbCr其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量,而且在空间将色度与亮度分离的特点。

且是二维独立分布,能较好的限制肤色分布区域。

通过对肤色的像素点在YCbCr空间投影,聚类得到了肤色聚类成椭圆形。

(5)首先采集肤色样本,进行颜色空间转化,并进行图像平滑处理,将噪声减小。

OpenCV基础笔记

OpenCV基础笔记

OpenCV基础笔记本⽂⼤部分内容来源于本篇将介绍和深度学习数据处理阶段最相关的基础使⽤,并完成4个有趣实⽤的⼩例⼦:延时摄影⼩程序视频中截屏采样的⼩程序图⽚数据增加(data augmentation)的⼩⼯具物体检测框标注⼩⼯具1 OpenCV 简介OpenCV 是计算机视觉领域应⽤最⼴泛的开源⼯具包,基于 C/C++,⽀持 Linux/Windows/MacOS/Android/iOS,并提供了 Python,Matlab 和 Java 等语⾔的接⼝,因为其丰富的接⼝,优秀的性能和商业友好的使⽤许可,不管是学术界还是业界中都⾮常受欢迎。

OpenCV 最早源于 Intel 公司 1998 年的⼀个研究项⽬,当时在 Intel 从事计算机视觉的⼯程师盖瑞·布拉德斯基(Gary Bradski)访问⼀些⼤学和研究组时发现学⽣之间实现计算机视觉算法⽤的都是各⾃实验室⾥的内部代码或者库,这样新来实验室的学⽣就能基于前⼈写的基本函数快速上⼿进⾏研究。

于是 OpenCV 旨在提供⼀个⽤于计算机视觉的科研和商业应⽤的⾼性能通⽤库。

第⼀个 alpha 版本的 OpenCV 于 2000 年的 CVPR 上发布,在接下来的 5 年⾥,⼜陆续发布了 5 个 beta 版本,2006 年发布了第⼀个正式版。

2009 年随着盖瑞加⼊了 Willow Garage,OpenCV 从 Willow Garage 得到了积极的⽀持,并发布了 1.1 版。

2010 年 OpenCV 发布了 2.0 版本,添加了⾮常完备的 C++ 接⼝,从 2.0 开始的版本⾮常⽤户⾮常庞⼤,⾄今仍在维护和更新。

2015 年 OpenCV 3 正式发布,除了架构的调整,还加⼊了更多算法,更多性能的优化和更加简洁的 API,另外也加强了对 GPU 的⽀持,现在已经在许多研究机构和商业公司中应⽤开来。

1.1 OpenCV 的结构和 Python ⼀样,当前的 OpenCV 也有两个⼤版本,OpenCV2 和 OpenCV3。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

OpenCV学习笔记非打印版本直方图#include"opencv2/highgui/highgui.hpp"#include"opencv2/imgproc/imgproc.hpp"#include<iostream>#include<stdio.h>using namespace std;using namespace cv;/**@函数main*/int main(int argc,char**argv){Mat src,dst;///装载图像src=imread("001.jpg");if(!src.data){return-1;}///分割成3个单通道图像(R,G和B)vector<Mat>rgb_planes;split(src,rgb_planes);///设定bin数目int histSize=255;///设定取值范围(R,G,B))float range[]={0,255};const float*histRange={range};bool uniform=true;bool accumulate=false;Mat r_hist,g_hist,b_hist;///计算直方图:calcHist(&rgb_planes[0],1,0,Mat(),r_hist,1,&histSize,&histRange,uniform,accumulate); calcHist(&rgb_planes[1],1,0,Mat(),g_hist,1,&histSize,&histRange,uniform,accumulate); calcHist(&rgb_planes[2],1,0,Mat(),b_hist,1,&histSize,&histRange,uniform,accumulate); //创建直方图画布int hist_w=400;int hist_h=400;int bin_w=cvRound((double)hist_w/histSize);Mat histImage(hist_w,hist_h,CV_8UC3,Scalar(0,0,0));///将直方图归一化到范围[0,histImage.rows]normalize(r_hist,r_hist,0,histImage.rows,NORM_MINMAX,-1,Mat());normalize(g_hist,g_hist,0,histImage.rows,NORM_MINMAX,-1,Mat());normalize(b_hist,b_hist,0,histImage.rows,NORM_MINMAX,-1,Mat());///在直方图画布上画出直方图for(int i=1;i<histSize;i++){line(histImage,Point(bin_w*(i-1),hist_h-cvRound(r_hist.at<float>(i-1))), Point(bin_w*(i),hist_h-cvRound(r_hist.at<float>(i))),Scalar(0,0,255),2,8,0);line(histImage,Point(bin_w*(i-1),hist_h-cvRound(g_hist.at<float>(i-1))), Point(bin_w*(i),hist_h-cvRound(g_hist.at<float>(i))),Scalar(0,255,0),2,8,0);line(histImage,Point(bin_w*(i-1),hist_h-cvRound(b_hist.at<float>(i-1))), Point(bin_w*(i),hist_h-cvRound(b_hist.at<float>(i))),Scalar(255,0,0),2,8,0);}///显示直方图namedWindow("calcHist Demo",CV_WINDOW_AUTOSIZE);imshow("calcHist Demo",histImage);waitKey(0);return0;}图像金字塔#include<cv.h>#include<highgui.h>#include<iostream>#include<cmath>#include<cstdlib>#include<cstdio>using namespace cv;using namespace std;Mat src,dst,tmp;char*window_name="Pyramids Demo";int main(){cout<<"\n Zoom In-Out demo\n"<<endl;cout<<"--------------------\n";cout<<"*[u]->Zoom in\n"<<endl;cout<<"*[d]->Zoom out\n"<<endl;cout<<"*[ESC]->Close program\n\n"<<endl;src=imread("001.jpg");if(!src.data){cout<<"No data!--Exiting the program\n"<<endl;return-1;}tmp=src;dst=tmp;namedWindow(window_name,CV_WINDOW_AUTOSIZE);imshow(window_name,dst);while(true){int c;c=waitKey(10);if((char)c==27){break;}if((char)c=='u'){pyrUp(tmp,dst,Size(tmp.cols*2,tmp.rows*2));printf("**Zoom In:Image x2\n");}else if((char)c=='d'){pyrDown(tmp,dst,Size(tmp.cols/2,tmp.rows/2));cout<<"**Zoom Out:Image/2\n"<<endl;}imshow(window_name,dst);tmp=dst;}return0;}基于混合高斯背景建模的目标跟踪//混合高斯背景建模的目标跟踪#include"cv.h"#include"highgui.h"int main(){CvCapture*capture=cvCreateFileCapture("001.mp4");IplImage*mframe,*current,*frg,*test;int*fg,*bg_bw,*rank_ind;double*w,*mean,*sd,*u_diff,*rank;int C,M,sd_init,i,j,k,m,rand_temp=0,rank_ind_temp=0,min_index=0,x=0,y=0,counter_frame =0;double D,alph,thresh,p,temp;CvRNG state;int match,height,width;mframe=cvQueryFrame(capture);frg=cvCreateImage(cvSize(mframe->width,mframe->height),IPL_DEPTH_8U,1);current=cvCreateImage(cvSize(mframe->width,mframe->height),IPL_DEPTH_8U,1);test=cvCreateImage(cvSize(mframe->width,mframe->height),IPL_DEPTH_8U,1);C=4;//number of gaussian components(typically3-5)M=4;//number of background componentssd_init=6;//initial standard deviation(for new components)var=36in paperalph=0.01;//learning rate(between0and1)(from paper0.01)D=2.5;//positive deviation thresholdthresh=0.25;//foreground threshold(0.25or0.75in paper)p=alph/(1/C);//initial p variable(used to update mean and sd)height=current->height;width=current->widthStep;fg=(int*)malloc(sizeof(int)*width*height);//foreground arraybg_bw=(int*)malloc(sizeof(int)*width*height);//background arrayrank=(double*)malloc(sizeof(double)*1*C);//rank of components(w/sd)w=(double*)malloc(sizeof(double)*width*height*C);//weights arraymean=(double*)malloc(sizeof(double)*width*height*C);//pixel meanssd=(double*)malloc(sizeof(double)*width*height*C);//pixel standard deviationsu_diff=(double*)malloc(sizeof(double)*width*height*C);//difference of each pixel from mean for(i=0;i<height;i++){for(j=0;j<width;j++){for(k=0;k<C;k++){mean[i*width*C+j*C+k]=cvRandReal(&state)*255;w[i*width*C+j*C+k]=(double)1/C;sd[i*width*C+j*C+k]=sd_init;}}}while(1){rank_ind=(int*)malloc(sizeof(int)*C);cvCvtColor(mframe,current,CV_BGR2GRAY);//calculate difference of pixel values from meanfor(i=0;i<height;i++){for(j=0;j<width;j++){for(m=0;m<C;m++){u_diff[i*width*C+j*C+m]=abs((uchar)current->imageData[i*width+j]-mean[i*width*C +j*C+m]);}}}//update gaussian components for each pixelfor(i=0;i<height;i++){for(j=0;j<width;j++){match=0;temp=0;for(k=0;k<C;k++){if(abs(u_diff[i*width*C+j*C+k])<=D*sd[i*width*C+j*C+k])//pixel matches component{match=1;//variable to signal component match//update weights,mean,sd,pw[i*width*C+j*C+k]=(1-alph)*w[i*width*C+j*C+k]+alph;p=alph/w[i*width*C+j*C+k];mean[i*width*C+j*C+k]=(1-p)*mean[i*width*C+j*C+k]+p*(uchar)current->imageData[i*width+j];sd[i*width*C+j*C+k]=sqrt((1-p)*(sd[i*width*C+j*C+k]*sd[i*width*C+j*C +k])+p*(pow((uchar)current->imageData[i*width+j]-mean[i*width*C+j*C+k],2)));}else{w[i*width*C+j*C+k]=(1-alph)*w[i*width*C+j*C+k];//weight slighly decreases}temp+=w[i*width*C+j*C+k];}for(k=0;k<C;k++){w[i*width*C+j*C+k]=w[i*width*C+j*C+k]/temp;}temp=w[i*width*C+j*C];bg_bw[i*width+j]=0;for(k=0;k<C;k++){bg_bw[i*width+j]=bg_bw[i*width+j]+mean[i*width*C+j*C+k]*w[i*width*C+j*C +k];if(w[i*width*C+j*C+k]<=temp){min_index=k;temp=w[i*width*C+j*C+k];}rank_ind[k]=k;}test->imageData[i*width+j]=(uchar)bg_bw[i*width+j];//if no components match,create new componentif(match==0){mean[i*width*C+j*C+min_index]=(uchar)current->imageData[i*width+j];//printf("%d",(uchar)bg->imageData[i*width+j]);sd[i*width*C+j*C+min_index]=sd_init;}for(k=0;k<C;k++){rank[k]=w[i*width*C+j*C+k]/sd[i*width*C+j*C+k];//printf("%f",w[i*width*C+j*C+k]);}//sort rank valuesfor(k=1;k<C;k++){for(m=0;m<k;m++){if(rank[k]>rank[m]){//swap max valuesrand_temp=rank[m];rank[m]=rank[k];rank[k]=rand_temp;//swap max index valuesrank_ind_temp=rank_ind[m];rank_ind[m]=rank_ind[k];rank_ind[k]=rank_ind_temp;}}}//calculate foregroundmatch=0;k=0;//frg->imageData[i*width+j]=0;while((match==0)&&(k<M)){if(w[i*width*C+j*C+rank_ind[k]]>=thresh)if(abs(u_diff[i*width*C+j*C+rank_ind[k]])<=D*sd[i*width*C+j*C+rank_ind[k]]){ frg->imageData[i*width+j]=0;match=1;}elsefrg->imageData[i*width+j]=(uchar)current->imageData[i*width+j];k=k+1;}}}mframe=cvQueryFrame(capture);cvShowImage("fore",frg);cvShowImage("back",test);char s=cvWaitKey(33);if(s==27)break;free(rank_ind);}free(fg);free(w);free(mean);free(sd);free(u_diff);free(rank);cvNamedWindow("back",0);cvNamedWindow("fore",0);cvReleaseCapture(&capture);cvDestroyWindow("fore");cvDestroyWindow("back");return0;}Camshift#include"opencv2/video/tracking.hpp"#include"opencv2/imgproc/imgproc.hpp"#include"opencv2/highgui/highgui.hpp"#include<iostream>#include<ctype.h>using namespace cv;using namespace std;Mat image;bool backprojMode=false;//表示是否要进入反向投影模式,ture表示准备进入反向投影模式bool selectObject=false;//代表是否在选要跟踪的初始目标,true表示正在用鼠标选择int trackObject=0;//代表跟踪目标数目bool showHist=true;//是否显示直方图Point origin;//用于保存鼠标选择第一次单击时点的位置Rect selection;//用于保存鼠标选择的矩形框int vmin=10,vmax=256,smin=30;void onMouse(int event,int x,int y,int,void*){if(selectObject)//只有当鼠标左键按下去时才有效,然后通过if里面代码就可以确定所选择的矩形区域selection了{selection.x=MIN(x,origin.x);//矩形左上角顶点坐标selection.y=MIN(y,origin.y);selection.width=std::abs(x-origin.x);//矩形宽selection.height=std::abs(y-origin.y);//矩形高selection&=Rect(0,0,image.cols,image.rows);//用于确保所选的矩形区域在图片范围内}switch(event){case CV_EVENT_LBUTTONDOWN:origin=Point(x,y);selection=Rect(x,y,0,0);//鼠标刚按下去时初始化了一个矩形区域selectObject=true;break;case CV_EVENT_LBUTTONUP:selectObject=false;if(selection.width>0&&selection.height>0)trackObject=-1;break;}}void help(){cout<<"\nThis is a demo that shows mean-shift based tracking\n""You select a color objects such as your face and it tracks it.\n""This reads from video camera(0by default,or the camera number the user enters\n""Usage:\n""./camshiftdemo[camera number]\n";cout<<"\n\nHot keys:\n""\tESC-quit the program\n""\tc-stop the tracking\n""\tb-switch to/from backprojection view\n""\th-show/hide object histogram\n""\tp-pause video\n""To initialize tracking,select the object with mouse\n";}const char*keys={"{1||0|camera number}"};int main(int argc,const char**argv){help();VideoCapture cap;//定义一个摄像头捕捉的类对象Rect trackWindow;RotatedRect trackBox;//定义一个旋转的矩阵类对象int hsize=16;float hranges[]={0,180};//hranges在后面的计算直方图函数中要用到const float*phranges=hranges;CommandLineParser parser(argc,argv,keys);//命令解析器函数int camNum=parser.get<int>("1");cap.open(camNum);//直接调用成员函数打开摄像头if(!cap.isOpened()){help();cout<<"***Could not initialize capturing...***\n";cout<<"Current parameter's value:\n";parser.printParams();return-1;}namedWindow("Histogram",0);namedWindow("CamShift Demo",0);setMouseCallback("CamShift Demo",onMouse,0);//消息响应机制createTrackbar("Vmin","CamShift Demo",&vmin,256,0);//createTrackbar函数的功能是在对应的窗口创建滑动条,滑动条Vmin,vmin表示滑动条的值,最大为256createTrackbar("Vmax","CamShift Demo",&vmax,256,0);//最后一个参数为0代表没有调用滑动拖动的响应函数createTrackbar("Smin","CamShift Demo",&smin,256,0);//vmin,vmax,smin初始值分别为10,256,30 Mat frame,hsv,hue,mask,hist,histimg=Mat::zeros(200,320,CV_8UC3),backproj;bool paused=false;for(;;){if(!paused)//没有暂停{cap>>frame;//从摄像头抓取一帧图像并输出到frame中if(frame.empty())break;}frame.copyTo(image);if(!paused)//没有按暂停键{cvtColor(image,hsv,CV_BGR2HSV);//将rgb摄像头帧转化成hsv空间的if(trackObject)//trackObject初始化为0,或者按完键盘的'c'键后也为0,当鼠标单击松开后为-1{int_vmin=vmin,_vmax=vmax;//inRange函数的功能是检查输入数组每个元素大小是否在2个给定数值之间,可以有多通道,mask保存0通道的最小值,也就是h分量//这里利用了hsv的3个通道,比较h,0~180,s,smin~256,v,min(vmin,vmax),max(vmin,vmax)。

相关文档
最新文档