opencv编写笔记
opencv笔记之图像创建、保存和复制

Main函数参数argc,argv说明C/C++语言中的main函数,经常带有参数argc,argv,如下:int main(int argc, char** argv)int main(int argc, char* argv[])这两个参数的作用: argc 是指命令行输入参数的个数(以空白符分隔) argv存储了所有的命令行参数假如你的程序是hello.exe,如果在命令行运行该程序,(首先应该在命令行下用cd 命令进入到hello.exe 文件所在目录)运行命令为:hello.exe Shiqi Yu那么,argc的值是3,argv[0]是"hello.exe",argv[1]是"Shiqi",argv[2]是"Yu"。
下面的程序演示argc和argv的使用:#include <stdio.h>int main(int argc, char ** argv){int i;for (i=0; i < argc; i++)printf("Argument %d is %s.\n", i, argv[i]);return 0;}假如上述代码编译为hello.exe,那么运行hello.exe a b c d e将得到Argument 0 is hello.exe.Argument 1 is a.Argument 2 is b.Argument 3 is c.Argument 4 is d.Argument 5 is e.运行hello.exe lena.jpg将得到Argument 0 is hello.exe.Argument 1 is lena.jpg.以上是解释pImg = cvLoadImage( argv[1], 0)) != 0就是运行cmd命令后dos命令进入exe所在文件夹如我的操作是记住girl.jpg先放和exe放在一个文件夹,执行cvSave_Copy.exe girl.jpg girl_copy.jpg 时中间有空格,在D:\VS\OpenCV\cvSave_Copy\Debug文件夹中就会出现一个girl_copy.jpg文件,且是经过灰度处理的,这样一幅图片的创建、复制、保存完成了有一发现:把exe文件和jpg文件拷到C:\Documents and Settings\Administrator下,直接如下执行即可。
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笔记(一)——Mat的引用计数机制

OpenCV笔记(⼀)——Mat的引⽤计数机制Mat是Opencv2⾥⾯主要的类。
Mat的对象常常⽤来表⽰⼀副图像的信息。
Mat的基本操作⼗分简单,不多说了。
下⾯这段代码能够读七⼋分明⽩,应该就算对Mat有⼤体了解。
1/* For description look into the help() function. */23 #include "opencv2/core/core.hpp"4 #include <iostream>56using namespace std;7using namespace cv;89static void help()10 {11 cout12 << "\n--------------------------------------------------------------------------" << endl13 << "This program shows how to create matrices(cv::Mat) in OpenCV and its serial"14 << " out capabilities" << endl15 << "That is, cv::Mat M(...); M.create and cout << M. " << endl16 << "Shows how output can be formated to OpenCV, python, numpy, csv and C styles." << endl17 << "Usage:" << endl18 << "./cvout_sample" << endl19 << "--------------------------------------------------------------------------" << endl20 << endl;21 }2223int main(int,char**)24 {25 help();26// create by using the constructor27 Mat M(2,2, CV_8UC3, Scalar(0,0,255));28 cout << "M = " << endl << "" << M << endl << endl;2930// create by using the create function()31 M.create(4,4, CV_8UC(2));32 cout << "M = "<< endl << "" << M << endl << endl;3334// create multidimensional matrices35int sz[3] = {2,2,2};36 Mat L(3,sz, CV_8UC(1), Scalar::all(0));37// Cannot print via operator <<3839// Create using MATLAB style eye, ones or zero matrix40 Mat E = Mat::eye(4, 4, CV_64F);41 cout << "E = " << endl << "" << E << endl << endl;4243 Mat O = Mat::ones(2, 2, CV_32F);44 cout << "O = " << endl << "" << O << endl << endl;4546 Mat Z = Mat::zeros(3,3, CV_8UC1);47 cout << "Z = " << endl << "" << Z << endl << endl;4849// create a 3x3 double-precision identity matrix50 Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);51 cout << "C = " << endl << "" << C << endl << endl;5253 Mat RowClone = C.row(1).clone();54 cout << "RowClone = " << endl << "" << RowClone << endl << endl;5556// Fill a matrix with random values57 Mat R = Mat(3, 2, CV_8UC3);58 randu(R, Scalar::all(0), Scalar::all(255));5960// Demonstrate the output formating options61 cout << "R (default) = " << endl << R << endl << endl;62 cout << "R (python) = " << endl << format(R,"python") << endl << endl;63 cout << "R (numpy) = " << endl << format(R,"numpy" ) << endl << endl;64 cout << "R (csv) = " << endl << format(R,"csv" ) << endl << endl;65 cout << "R (c) = " << endl << format(R,"C" ) << endl << endl;6667 Point2f P(5, 1);68 cout << "Point (2D) = " << P << endl << endl;6970 Point3f P3f(2, 6, 7);71 cout << "Point (3D) = " << P3f << endl << endl;727374 vector<float> v;75 v.push_back( (float)CV_PI); v.push_back(2); v.push_back(3.01f);7677 cout << "Vector of floats via Mat = " << Mat(v) << endl << endl;7879 vector<Point2f> vPoints(20);80for (size_t i = 0; i < vPoints.size(); ++i)81 vPoints[i] = Point2f((float)(i * 5), (float)(i % 7));8283 cout << "A vector of 2D Points = " << vPoints << endl << endl;84return0;85 }View Code⽂档上边说,Mat的数据成员由头部和数据组成。
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 基本架构分析多模块组合起来的一个软件开发工具包(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学习笔记(四)图像的邻域操作(简单滤波算法)原理:很多时候,我们对图像处理时,要考虑它的邻域,⽐如3*3是我们常⽤的,这在图像滤波、去噪中最为常见,下⾯我们介绍如果在⼀次图像遍历过程中进⾏邻域的运算。
下⾯我们进⾏⼀个简单的滤波操作,滤波算⼦为[0 –1 0;-1 5 –1;0 –1 0]。
它可以让图像变得尖锐,⽽边缘更加突出。
核⼼公式即:sharp(i.j)=5*image(i,j)-image(i-1,j)-image(i+1,j )-image(i,j-1)-image(i,j+1)。
程序:#include "stdafx.h"#include "highgui.h"#include < Windows.h >#includeusing namespace std;using namespace cv;void ImgFilter2d(const Mat &image,Mat& result)//传进来的两个参数,第⼀个是要进⾏变换的图像,第⼆个是将要显⽰的结果图像{result.create(image.size(),image.type());//创建⼀个和image的⼤⼩类型都相同的空间int nr=image.rows;//⾏数int nc=image.cols*image.channels();//每⼀⾏有多少个通道for(int i=1;i{const uchar* up_line=image.ptr(i-1);//指向上⼀⾏const uchar* mid_line=image.ptr(i);//当前⾏const uchar* down_line=image.ptr(i+1);//下⼀⾏uchar* cur_line=result.ptr(i);//Mat::ptr()来获得指向某⾏元素的指针for(int j=1;j{cur_line[j]=saturate_cast(5*mid_line[j]-mid_line[j-1]-mid_line[j+1]-up_line[j]-down_line[j]);}}// 把图像边缘像素设置为0result.row(0).setTo(Scalar(0));result.row(result.rows-1).setTo(Scalar(0));result.col(0).setTo(Scalar(0));result.col(result.cols-1).setTo(Scalar(0));}void main(){Mat image;Mat image1;image = imread("E:\\2.jpg");namedWindow("tuxiang");int n = 4000;imshow("tuxiang", image);ImgFilter2d(image, image1);namedWindow("image1");imshow("image1", image1);waitKey(0);}结果显⽰:上⾯的程序有以下⼏点需要说明:1,staturate_cast是⼀个类型转换函数,程序⾥是为了确保运算结果还在uchar范围内。
OPENCV学习笔记

OPENCV学习笔记1、键盘响应事件While(1){If(cvWaitKey(100)==27)break;}括号里为延时等待ms等于的数值为ASCLL码(27)ESC建。
2、回调函数callback键盘响应回调函数参数事件位置需要注册回调函数到OPCV中,实现注册的函数是Cvsetmousecallback(){const char*window_name,Cvmousecallback on_mouseVoid param=null.}第一个参数指定了回调函数需要注册到的窗口即产生事件的窗口。
只有在这个指定窗口中发生的事件才会掉用这个函数。
第二个参数为回调函数。
最后,第三个参数用来传递额外的信息给前面的void*param3、OPENCV的基本数据类型Points size rectangles scalar三元结构Cvpoint int x y图像中的点Cvpoint2D32f float x,y二维空间中的点Cvpoint3D32F float x,y,z三维空间中的点Cvsize int width height图像的尺寸Cvrect int x y width height图像的部分区域Cvscalar double val[4]RGBA值假设要在(5,10)(20,30)间画一个白色矩形,只需要简单调用Cvrectangle(Myimg,Cvpoint(5,10)Cvpoint(20,30)Cvscalar(255,255,255)//RGB值全满为白色);3、使用OPENCV时会频繁遇到Iplimage数据类型IplImage是我们用来为通常所说的“图像”进行编码的基本结构。
这些图像可能是灰度,色彩,4通道的(RGB+alpha),其中的每个通道可以包含任意的整数或浮点数。
因此,该类型比常见的、易于理解的3通道8位RGB图像更通用。
Ipllmage由cvmat派生,cvmat由cvarr派生。
opencv 笔记

cvDestroyWindow("image");
cvReleaseImage(&img);
return 0;
}
|-- int align; // 图像数据的行对齐: 4 or 8 byte alignment
| // OpenCV 中无此项,采用widthStep代替
|-- char colorModel[4]; // 颜色模型 – OpenCV中忽略此项
IplImage
|-- int nChannels; // 颜色通道数目 (1,2,3,4)
|-- int depth; // 像素的位深:
| // IPL_DEPTH_8U, IPL_DEPTH_8S,
| // IPL_16U,IPL_DEPTH_16S,
| // IPL_DEPTH_32S,IPL_DEPTH_32F,
| // IPL_DEPTH_64F
CVAPI(CvScalar) cvGet2D( const CvArr* arr, int idx0, int idx1 );
cvSet2D 给某个点赋值。
CVAPI(void) cvSet2D( CvArr* arr, int idx0, int idx1, CvScalar value );
|-- char *imageDataOrigin; // 图像数据未对齐时的数据原点指针
| // (需要正确地重新分配图像内存 )
| // (needed for correct image deallocation)
pixel = cvGet2D(img, i, j);
printf("B=%f,G=%f,R=%f\t", pixel.val[0], pixel.val[1], pixel.val[2]);
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学习笔记(一)摘要:由于最近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笔记⼀ Contour FindingContours使⽤ STL-style vector<> 表⽰,如 vector<cv::Point>, vector<cv::Point2f>。
opencv 中,使⽤函数 cv::findContours() 寻找contours,具体函数定义如下:void cv::findContours(cv::InputOutputArray image,cv::OutputArrayofArrays contours,cv::OutputArray hierarchy,int mode,int method,cv::Point offset = cv::Point());void cv::findContours(cv::InputOutputArray image,cv::OutputArrayofArrays contours,int mode,int method,cv::Point offset = cv::Point());参数 image 为8位单通道输⼊图像,⼀般情况下,该图像可能由 cv::threshold(),cv::adaptiveThreshold ⽣成。
当 image 由 cv::Canny() ⽣成时,cv::findContours() 仅当边缘图像为宽度为1的细区域图像,对于闭合边缘,可以使⽤内边缘或者外边缘代替边缘图像进⾏后续分析;但对于⾮闭合边缘,个⼈认为 cv::Canny() ⽣成的边缘图像不适合使⽤ cv::findContours()进⾏查找;替代⽅案是使⽤边缘跟踪算法,将 cv::Canny() ⽣成边缘保存在 vector<cv::Point>中,然后使⽤ Contours 相关分析进⾏更多分析。
参数 contours 为 vector<vector<cv::Point>>, vector<vector<cv::Point2f>>, 使⽤ array of arrays 结构可以同时保存多条 contours。
opencv 学习笔记、函数、方法、重难点、教程

1)通道拆分:b,g,r = cv2.spliti(img);b = cv2.split(img)[0];2)通道合并:img = cv2.merge([b,g,r]3)Np.arr: item(), itemset(),彩色图像必须包括行、列、列索引/通道;4)图像属性包括:shape(行,列,通道数)size(行*列*通道数)Dtype 数据类型5)“+”或cv2.add()对图像进行加法运算;区别:“+”a+b≤255时,取值a+ba+b>255时,取值mod(a+b,256)cv2.add()a+b≤255时,取值a+ba+b>255时,取值255注:cv2.add(),参数:(图像,图像);(图像,数值);(数值,图像)6)图像加权和:计算两幅图像的像素值之和时,将每幅图像的权重考虑进来:dst = saturate(src1*α+src2*β+γ);saturate()表示取饱和值7)Opencv中提供了函数cv2.addWeighted(),用来实现图像的加权和dst = cv2.addweighted(src1,alpha,src2,beta,gamma);该函数实现的功能是src1*α+src2*β+γ;α+β可以等于1,也可以不等于1,gamma可以是0,但是是必选参数,不能省略;8)按位逻辑运算:9)位平面分解代码:import cv2import numpy as npJieyi = cv2.imread("jieyi.jpg",0)cv2.imshow("lena",lena)r,c = lena.shapex = np.zeros((r,c,8),dtype = np.uint8) for i in range(8):x[:,:,i] = 2**ir = np.zeros((r,c,8),dtype = np.uint8)for i in range(8):r[:,:,i] = cv2.bitwise_and(lena,x[:,:,i]) mask = r[:,:,i]>0r[mask] = 255cv2.imshow(str(i),r[:,:,i])cv2.waitKey()cv2.destroyAllWindows()10)HSV色彩空间:色调(Hue,也称色相),饱和度(saturation)、亮度(value)●色调:详见附录二色调环,范围[0,360]●饱和度:指相对纯净度,或一种颜色混合白光的数量,饱和度与所加白光的数量成反比,范围[0,1]●亮度:反应的是人眼感受到的光的明暗程度,该指标与物体的反射程度有关。
OpenCV笔记(3)(Canny边缘检测、高斯金字塔、拉普拉斯金字塔、图像轮廓、模板匹配)

OpenCV笔记(3)(Canny边缘检测、⾼斯⾦字塔、拉普拉斯⾦字塔、图像轮廓、模板匹配)⼀、Canny边缘检测Canny边缘检测是⼀系列⽅法综合的结果。
其中主要包含以下步骤:1.使⽤⾼斯滤波器,平滑图像,滤除噪声。
2.计算图像中每个像素点的梯度强度和⽅向。
3.应⽤⾮极⼤值抑制(NMS:Non-Maximum Suppression),以消除边缘检测带来的杂散相应。
4.应⽤双阈值(Double-Threshold)检测来确定真实和潜在的边缘。
5.通过抑制孤⽴的弱边缘最终完成边缘检测。
1.⾼斯滤波器平滑图像。
2.计算梯度和⽅向使⽤X和Y⽅向的Sobel算⼦来分别计算XY⽅向梯度:每个点的梯度强度有XY⽅向的梯度计算出来:计算每个点梯度的⽅向:3.使⽤NMS有两种⽅法,第⼀种⽅法(插值法,⽐较复杂):通过计算出的梯度⽅向,找到与周边临近点的边的交点,然后使⽤权重计算交点的值,假设g1和g2之间的交点(左上的⿊点)处于6/4的位置,那么他的值为M = g1*(1-0.6)+g2*(0.4)。
当算出左上的⿊点和右下的⿊点值后,⽤这两个点与C的值进⾏⽐较,如果都⼩于C,则C归为边界。
如果有⼀个⽐C⼤,则丢弃C,这就叫抑制。
第⼆种⽅法(指定8个⽅向,不⽤插值,简化版):4.双阈值检测在NMS的基础上,判断⼀个边界点的梯度强度: (1) 如果值⼤于maxVal,则处理为边界 (2) 如果值minVal<梯度值<maxVal,再检查是否挨着其他边界点,如果旁边没有边界点,则丢弃,如果连着确定的边界点,则也认为其为边界点。
(3) 梯度值<minVal,舍弃。
通过以上步骤,完成Canny边缘检测。
调⽤Canny API如下:# 使⽤Canny边界检测def use_canny(image):# 后⾯两个参数代表双阈值检测的minVal和maxValimg1 = cv.Canny(image, 50, 100)cv.imshow('img1', img1)# 这⾥使⽤更⼤的minVal和maxVal,细节边界变少了img2 = cv.Canny(image, 170, 250)cv.imshow('img2', img2)⼆、⾼斯⾦字塔图像⾦字塔:Image pyramid如图中所⽰,从0到3是⼀个下采样过程(指图⽚越来越⼩的⽅向),从3到0是⼀个上采样过程(将图⽚变⼤的过程),⼀次下采样加⼀次上采样不等于原图像,因为会损失⼀些细节信息。
opencv基础矩阵求解解析笔记

OpenCV基础矩阵求解解析笔记一、前言在计算机视觉和图像处理领域,矩阵求解是一项基础且关键的技术。
OpenCV作为一个开源的计算机视觉库,提供了丰富的矩阵求解函数,为图像处理和计算机视觉任务提供了强大的支持。
本文将深入探讨OpenCV中的矩阵求解相关知识,包括基本概念、常用方法以及实际应用场景。
二、矩阵求解基础概念1. 线性方程组在数学中,线性方程组是由若干个线性方程组成的方程组,其中未知数是多个变量。
线性方程组可以用矩阵和向量的形式表示,如下所示:Ax = b其中,A是一个m×n的矩阵,x是一个n×1的列向量,b是一个m×1的列向量。
对于给定的A和b,求解x即为矩阵求解的过程。
2. 矩阵求解方法常见的矩阵求解方法包括高斯消元法、LU分解法、Cholesky分解法、QR分解法等。
这些方法在不同情况下有不同的适用性,可以根据实际问题的特点选择合适的方法进行求解。
三、 OpenCV中的矩阵求解函数OpenCV提供了丰富的矩阵求解函数,可以满足不同需求的求解问题。
下面介绍几个常用的矩阵求解函数及其用法。
1. cv::solve函数cv::solve函数是OpenCV中用于求解线性方程组的函数。
其函数原型如下:bool solve(InputArray src1, InputArray src2, OutputArray dst, int flags=DECOMP_LU)其中,src1是系数矩阵A,src2是右侧向量b,dst是解向量x,flags是求解方法。
DECOMP_LU表示使用LU分解方法进行求解。
2. cv::invert函数cv::invert函数用于求解逆矩阵。
其函数原型如下:double invert(InputArray src, OutputArray dst, intflags=DECOMP_LU)其中,src是需要求逆的矩阵,dst是求得的逆矩阵,flags表示求解方法。
opencv防抖实践及代码解析笔记

opencv防抖实践及代码解析笔记一、OpenCV防抖实践笔记:在图像处理中,防抖是一种常见的技术,可以通过平滑图像中的噪声或震动,使得图像更加清晰和稳定。
OpenCV是一个强大的开源计算机视觉库,提供了许多图像处理和计算机视觉算法。
本文将介绍OpenCV中防抖的实践及代码解析。
在OpenCV中,可以通过一些图像处理技术实现防抖,常用的方法包括平均滤波、中值滤波、高斯滤波等。
这些滤波算法能够有效地去除图像中的噪声,提升图像的质量和稳定性。
一种常用的防抖方法是平均滤波。
平均滤波是指将图像中的每个像素与其周围像素的平均值进行替换,从而实现去噪的目的。
在OpenCV中,可以使用cv2.blur函数实现平均滤波。
下面是一个简单的代码示例:```pythonimport cv2import numpy as np# 读取图像image = cv2.imread('image.jpg')# 平均滤波averaged = cv2.blur(image, (5, 5))# 显示结果cv2.imshow('Original', image)cv2.imshow('Averaged', averaged)cv2.waitKey(0)cv2.destroyAllWindows()```上述代码中,首先使用cv2.imread函数加载图像,然后使用cv2.blur函数对图像进行平均滤波。
其中,第二个参数(5, 5)表示滤波器的尺寸,即对每个像素周围5x5的区域进行平均。
最后,使用cv2.imshow函数显示原始图像和防抖后的图像。
除了平均滤波,中值滤波也是一种常用的防抖方法。
中值滤波是指将图像中每个像素的值替换为该像素周围邻域像素的中值,从而实现去除离群值和噪声的目的。
在OpenCV中,可以使用cv2.medianBlur函数实现中值滤波。
下面是一个简单的代码示例:```pythonimport cv2import numpy as np# 读取图像image = cv2.imread('image.jpg')# 中值滤波median = cv2.medianBlur(image, 5)# 显示结果cv2.imshow('Original', image)cv2.imshow('Median', median)cv2.waitKey(0)cv2.destroyAllWindows()```上述代码中,使用cv2.medianBlur函数对图像进行中值滤波。
opencv学习笔记(六)直方图比较图片相似度

opencv学习笔记(六)直⽅图⽐较图⽚相似度opencv学习笔记(六)直⽅图⽐较图⽚相似度 opencv提供了API来⽐较图⽚的相似程度,使我们很简单的就能对2个图⽚进⾏⽐较,这就是直⽅图的⽐较,直⽅图英⽂是histogram, 原理就是就是将图⽚转换成直⽅图,然后对直⽅图进⾏⽐较,在某些程度,真实地反映了图⽚的相似度。
代码如下:1 #include <iostream>2 #include <cv.h>3 #include <highgui.h>4using namespace std;5using namespace cv;67int main(void)8 {9 Mat pic1 = imread("pic1.jpg");10 Mat pic2 = imread("pic2.jpg");11//计算相似度12if (pic2.channels() == 1) {//单通道时,13int histSize = 256;14float range[] = { 0, 256 };15const float* histRange = { range };16bool uniform = true;17bool accumulate = false;1819 cv::Mat hist1, hist2;2021 cv::calcHist(&pic2, 1, 0, cv::Mat(), hist1, 1, &histSize, &histRange, uniform, accumulate);22 cv::normalize(hist1, hist1, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());2324 cv::calcHist(&pic1, 1, 0, cv::Mat(), hist2, 1, &histSize, &histRange, uniform, accumulate);25 cv::normalize(hist2, hist2, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());2627double dSimilarity = cv::compareHist(hist1, hist2, CV_COMP_CORREL);//,CV_COMP_CHISQR,CV_COMP_INTERSECT,CV_COMP_BHATTACHARYYA CV_COMP_CORREL 2829 cout << "similarity = " << dSimilarity << endl;30 }31else {//三通道时32 cv::cvtColor(pic2, pic2, cv::COLOR_BGR2HSV);33 cv::cvtColor(pic1, pic1, cv::COLOR_BGR2HSV);3435int h_bins = 50, s_bins = 60;36int histSize[] = { h_bins, s_bins };37float h_ranges[] = { 0, 180 };38float s_ranges[] = { 0, 256 };39const float* ranges[] = { h_ranges, s_ranges };40int channels[] = { 0, 1 };4142 cv::MatND hist1, hist2;4344 cv::calcHist(&pic2, 1, channels, cv::Mat(), hist1, 2, histSize, ranges, true, false);45 cv::normalize(hist1, hist1, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());4647 cv::calcHist(&pic1, 1, channels, cv::Mat(), hist2, 2, histSize, ranges, true, false);48 cv::normalize(hist2, hist2, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());4950double dSimilarity = cv::compareHist(hist1, hist2, CV_COMP_CORREL); //,CV_COMP_CHISQR,CV_COMP_INTERSECT,CV_COMP_BHATTACHARYYA CV_COMP_CORREL 5152 cout << "similarity = " << dSimilarity << endl;53 }54 waitKey(0);55return1;5657 } pic1: pic2: 使⽤相关系数法(CV_COMP_CORREL)进⾏图⽚相似度⽐较时,取值范围为[-1,1];越接近1说明两幅图⽚越相似; ⽐较pic1与pic2得到的结果为: similarity =0.926247 pic与本⾝进⾏⽐较时, similarity =1。
OpenCV学习笔记(2)

第二章数据结构OpenCV核心库的数据结构一、基本数据结构CvPoint、CvPoint2D32f、CvPoint3D32f、CvSize、CvSize2D32f、CvSize3D32f、CvRectCvScalar(N元组)CvMat、CvMatND、CvSpareseMat、CvTermCriteria、CvArr、Iplimage例题4-1:基本数据类型使用说明:cvFlip:垂直,水平或即垂直又水平翻转二维数组void cvFlip( const CvArr* src, CvArr* dst=NULL, int flip_mode=0); flip_mode :指定怎样去翻转数组。
flip_mode = 0 沿X-轴翻转,flip_mode > 0 (如1) 沿Y-轴翻转,flip_mode < 0 (如-1) 沿X-轴和Y-轴翻转.见下面的公式函数cvFlip 以三种方式之一翻转数组(行和列下标是以0为基点的):dst(i,j)=src(rows(src)-i-1,j) if flip_mode = 0dst(i,j)=src(i,cols(src1)-j-1) if flip_mode > 0dst(i,j)=src(rows(src)-i-1,cols(src)-j-1) if flip_mode < 0二、数组有关的结构1、数组定义IplImage和cvMat结构的基本使用方法IplImage:图像结构typedef struct _IplImage{int nSize; /* IplImage大小*/int ID; /* 版本(=0)*/int nChannels; /* 大多数OPENCV函数支持1,2,3 或4 个通道*/int alphaChannel; /* 被OpenCV忽略*/int depth; /* 像素的位深度: IPL_DEPTH_8U, IPL_DEPTH_8S,IPL_DEPTH_16U,IPL_DEPTH_16S, IPL_DEPTH_32S,IPL_DEPTH_32F and IPL_DEPTH_64F 可支持*/ char colorModel[4]; /* 被OpenCV忽略*/char channelSeq[4]; /* 同上*/int dataOrder; /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道.cvCreateImage只能创建交叉存取图像*/ int origin; /* 0 - 顶—左结构,1 - 底—左结构(Windows bitmaps 风格) */int align; /* 图像行排列(4 or 8). OpenCV 忽略它,使用widthStep 代替*/int width; /* 图像宽像素数*/int height; /* 图像高像素数*/struct _IplROI *roi;/* 图像感兴趣区域. 当该值非空只对该区域进行处理*/struct _Iplimage *maskROI; /* 在OpenCV中必须置NULL */void *ImageId; /* 同上*/struct _IplTileInfo *tileInfo; /*同上*/int imageSize; /* 图像数据大小(在交叉存取格式下imageSize=image->height*image->widthStep),单位字节*/char *imageData; /* 指向排列的图像数据*/int widthStep; /* 排列的图像行大小,以字节为单位*/int BorderMode[4]; /* 边际结束模式, 被OpenCV忽略*/int Borderconst[4]; /* 同上*/char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的*/}IplImage;IplImage结构来自于Intel Image Processing Library(是其本身所具有的)。
Opencv学习笔记blobFromImage函数、forward函数

Opencv学习笔记blobFromImage函数、forward函数官网以及网上对blobFromImage函数、forward函数讲解的很详细,但是对于输出的结果几乎没有介绍,所以很多时候再对于输出之后怎么处理让人比较困惑。
blobFromImage函数原型1.blobFromImage(InputArray image,2.double scalefactor=1.0,3.const Size& size = Size(),4.const Scalar& mean = Scalar(),5.bool swapRB = false,6.bool crop = false,7.int ddepth = CV_32F)image:这个就是我们将要输入神经网络进行处理或者分类的图片。
mean:需要将图片整体减去的平均值,如果我们需要对RGB图片的三个通道分别减去不同的值,那么可以使用3组平均值,如果只使用一组,那么就默认对三个通道减去一样的值。
减去平均值(mean):为了消除同一场景下不同光照的图片,对我们最终的分类或者神经网络的影响,我们常常对图片的R、G、B通道的像素求一个平均值,然后将每个像素值减去我们的平均值,这样就可以得到像素之间的相对值,就可以排除光照的影响。
scalefactor:当我们将图片减去平均值之后,还可以对剩下的像素值进行一定的尺度缩放,它的默认值是1,如果希望减去平均像素之后的值,全部缩小一半,那么可以将scalefactor设为1/2。
size:这个参数是我们神经网络在训练的时候要求输入的图片尺寸。
swapRB:OpenCV中认为我们的图片通道顺序是BGR,但是我平均值假设的顺序是RGB,所以如果需要交换R和G,那么就要使swapRB=true函数内的参数需要根据你训练的网络的相关参数调整。
blobFromImage函数输出函数返回4D矩阵(没有定义行/列值,因此这些值为-1)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
建工程步骤省略!!!!!!1、项目—demo(自己取项目名称)属性---配置属性—VC++目录—包含目录:D:\opencv\opencv\build\include;)2、配置属性—VC++目录—库目录:D:\opencv\opencv\build\x86\vc10\lib3、链接器—输入—附加依赖项—添加一下这些(针对Debug调试):opencv_ml2410d.libopencv_calib3d2410d.libopencv_contrib2410d.libopencv_core2410d.libopencv_features2d2410d.libopencv_flann2410d.libopencv_gpu2410d.libopencv_highgui2410d.libopencv_imgproc2410d.libopencv_legacy2410d.libopencv_objdetect2410d.libopencv_ts2410d.libopencv_video2410d.libopencv_nonfree2410d.libopencv_ocl2410d.libopencv_photo2410d.libopencv_stitching2410d.libopencv_superres2410d.libopencv_videostab2410d.lib◆按F5运行,若出现这样的情况:无法找到系统文件,缺少…..demo.exe程序。
则需下载tbb41_20130314oss_win.zip,将其解压后文件夹中包含的bin文件夹,复制到D:\opencv\opencv\build\common\tbb里;若还不行,可关掉当前文件,重新建立新项目,再进行配置!◆完成以后,计算机属性---高级系统设置—环境变量---选择path—双击—添加路径:D:\opencv\opencv\build\x86\vc10\bin;D:\opencv\opencv\build\common\tbb\ia32\vc10配置完成!!!!!!永久的配置:上述步骤创建的两个属性表OpenCV_debug_property.props和OpenCV_release_property.props保存到一个常用的文件夹中。
当创建新工程时,只需在属性管理器中添加上述两个属性表就可,快速完成配置OpenCV的步骤。
学习笔记:加载图像并显示的程序:没有把include文件夹里的opencv与opencv2文件夹添加到包含目录下。
出现“无法打开源文件”的错误提示(红波浪线)。
●加载播放AVI视频:理解了程序以及各个函数意义:●载入图像并平滑处理:这个问题如何解决??改成了这个!!!!!载入彩色图像,变为灰度图像,并缩小图像2次,然后进行边缘检测:高斯滤波算法处理:处理前处理后主要程序:中值滤波处理:处理前处理后主要程序:领域平均滤波:处理前:处理后下图为小波变换后的图像,通过自己建立小波变换函数与逆变换函数,对任意大小的彩色图像进行任意层次的变换。
具体代码已有注释说明,遇到几个问题:1、刚开始将DWT函数与IDWT函数放在了main函数之后,程序运行时出现错误:无法找到DWT与IDWT标识符;然而将两个子函数放在了main函数之前,运行就正确了,但此时还没有图像显示。
2、1正确以后,没有图像显示,我又再最后加了一句cvWaitKey(0);的语句,再运行,就出现了结果,基本正确。
3、我想连原图一起显示,可是试了好多都不行!!!小波变换的滤波方法:将原始图像在水平、垂直和对角线方向进行小波分解,将图像分解为1个低频图像和3个高频图像,属于频域滤波!基本过程:小波变换分解—设置一定的阈值对小波系数进行处理—小波逆变换得到空域图像。
处理前小波变换后彩色图像直方图均衡化:原始图像直方图化均衡后对比度线性展宽:载入原图如下所示(按着顺序来的):转换成灰色图像,如下所示:刚开始我写的程序,在求存放图像各个灰度级出现的次数的时候,将x,y变量的范围只取到了256,所以造成最后变换的图像无法将我载入的图像的所有像素显示完,所以出现了如下结果的照片:结果经查找资料后发现,x与y的取值范围应该这样来取(选取输入图像的宽度和高度的范围),才能保证载入的图像的所有灰度级都被计算完整:将程序改成这样以后,再运行,就能的到一张完整的经过对比度调整的图像:本来打算加几行代码,也显示对比度增强的彩色图像,结果发现按照我自己的想法加上代码,变成了这样:右侧的全灰是因为取得255造成的;而且我还觉得图像好像都左右颠倒一下,这是为什么???彩色依然显示灰色是因为只有一个通道“3“是”1“的时候将1通道改成3了以后,为什么只会显示一半的彩色图像???把3改成了4,没有彩色,反而有种加了颜色的感觉;就变成了这个样子的了!!!!!彩色对比度增强的程序:,没成功:::后面的程序就是对比度增加的程序了!!!!!!!int main(){IplImage*in_color=cvLoadImage("pp.jpg",-1);//载?入¨?图ª?像?cvNamedWindow("原-图ª?",CV_WINDOW_AUTOSIZE);cvShowImage("原-图ª?",in_color);IplImage*Y=cvCreateImage(cvGetSize(in_color),IPL_DEPTH_8U,1);IplImage*Cb=cvCreateImage(cvGetSize(in_color),IPL_DEPTH_8U,1);IplImage*Cr=cvCreateImage(cvGetSize(in_color),IPL_DEPTH_8U,1);IplImage*Compile_Ycbcr=cvCreateImage(cvGetSize(in_color),IPL_DEPTH_8U,3);IplImage*dst1=cvCreateImage(cvGetSize(in_color),IPL_DEPTH_8U,3);int i;cvCvtColor(in_color,dst1,CV_BGR2YCrCb);///CV_BGR2YCrCb=36* Constants for colorconversion */cvSplit(dst1,Y,Cb,Cr,0);//彩¨º色¦?图ª?像?分¤?割?函¡¥数ºyImageStrechByHistogram(Y,dst1);//将?输º?入¨?的Ì?Y图ª?像?,ê?经-对?比À¨¨度¨¨增?加¨®后¨®,ê?dst1输º?出?for(int x=0;x<in_color->height;x++){for(int y=0;y<in_color->width;y++){CvMat*cur=cvCreateMat(3,1,CV_32F);//cvCreateMat( int rows, intcols, int type );/* Allocates and initializes CvMat header and allocates data */cvmSet(cur,0,0,((uchar*)(dst1->imageData+x*dst1->widthStep))[y]);//cvmSet( CvMat* mat, int row, int col, double value )cvmSet(cur,1,0,((uchar*)(Cb->imageData+x*Cb->widthStep))[y]);cvmSet(cur,2,0,((uchar*)(Cr->imageData+x*Cr->widthStep))[y]);for(i=0;i<3;i++){double xx=cvmGet(cur,i,0);//cvmGet( constCvMat* mat, int row, int col )((uchar*)Compile_Ycbcr->imageData+x*Compile_Ycbcr->widthStep)[y*3+i]=xx;}}}cvCvtColor(Compile_Ycbcr,in_color,CV_YCrCb2BGR);//CV_YCrCb2BGR=38cvNamedWindow("Y",CV_WINDOW_AUTOSIZE);cvShowImage("Y",Y);cvNamedWindow("dst1",CV_WINDOW_AUTOSIZE);cvShowImage("dst1",dst1);cvNamedWindow("Compile_Ycbcr",CV_WINDOW_AUTOSIZE);cvShowImage("Compile_Ycbcr",Compile_Ycbcr);cvWaitKey(0);cvDestroyWindow("Y");cvDestroyWindow("dst1");cvDestroyWindow("原-图ª?");cvDestroyWindow("Compile_Ycbcr");}我结合了前面的直方图均衡化的程序,加到了对比度增加的程序里,结果如图所示的效果,我总感觉这就是直方图均衡化,既增加了亮度又增加了对比度!!灰度载入的图像,以CV_LOAD_IMAGE_GRAYSCALE格式输入,就会直接显示的是灰色图像伪彩色处理后的图片彩虹的颜色:主要思路是把灰度图对应的0~255的数值分别转换成彩虹色:红橙黄绿青蓝,就根据这6种颜色的RGB值,来转换!!!将Canny边缘检测与创建滑动条函数相结合,能更好的检测到边缘,进过程序编写,得到如下两幅图的:要注意的是,滑动条显示的窗口名称与边缘检测输出图像显示的窗口名称是一样的!!!索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。