OPENCV函数

合集下载

cv2库函数

cv2库函数

cv2 库是OpenCV(Open Source Computer Vision Library)的Python 接口。

OpenCV 是一个开源计算机视觉库,提供了许多用于图像处理和计算机视觉任务的函数。

以下是一些常用的cv2 库函数,涵盖了图像处理、计算机视觉和计算机图形学等领域:图像读取和显示:cv2.imread():读取图像文件。

cv2.imshow():显示图像窗口。

cv2.imwrite():保存图像。

颜色空间转换:cv2.cvtColor():进行颜色空间的转换,例如从BGR 到灰度。

图像处理:cv2.resize():调整图像大小。

cv2.flip():翻转图像。

cv2.rotate():旋转图像。

cv2.threshold():图像二值化。

滤波器和卷积:cv2.filter2D():2D 卷积。

cv2.blur():均值模糊。

cv2.GaussianBlur():高斯模糊。

边缘检测:cv2.Canny():Canny 边缘检测。

轮廓和形状分析:cv2.findContours():查找图像中的轮廓。

cv2.drawContours():绘制轮廓。

图像特征和描述符:cv2.SIFT():尺度不变特征变换。

cv2.SURF():加速稳健特征。

计算机视觉:cv2.matchTemplate():模板匹配。

cv2.findHomography():查找透视变换。

cv2.solvePnP():解决透视问题。

摄像头和视频处理:cv2.VideoCapture():打开摄像头。

cv2.VideoWriter():写入视频文件。

cv2.VideoCapture.read():读取摄像头帧。

图像绘制:cv2.line():绘制直线。

cv2.circle():绘制圆。

cv2.rectangle():绘制矩形。

这只是cv2 库中一小部分常用函数的列表。

OpenCV 提供了丰富的功能,适用于各种计算机视觉和图像处理任务。

opencv 坐标变换函数

opencv 坐标变换函数

opencv 坐标变换函数OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法。

在OpenCV中,坐标变换是常用的操作之一,它可以帮助我们将图像或物体从一个坐标系转换到另一个坐标系,以适应不同的需求或处理流程。

OpenCV提供了一些函数来实现坐标变换,包括平移、旋转、缩放和仿射变换等。

下面将逐个介绍这些函数的用法和作用。

1. 平移变换(translation):通过平移变换,我们可以将图像或物体沿着x和y轴方向移动一定的距离。

在OpenCV中,可以使用`cv2.warpAffine`函数来实现平移变换。

该函数接受一个输入图像、一个平移矩阵和输出图像的大小作为参数,返回经过平移变换后的图像。

2. 旋转变换(rotation):通过旋转变换,我们可以将图像或物体按照一定的角度进行旋转。

在OpenCV中,可以使用`cv2.getRotationMatrix2D`函数来获取旋转矩阵,然后使用`cv2.warpAffine`函数进行旋转变换。

该函数接受一个输入图像、一个旋转矩阵和输出图像的大小作为参数,返回经过旋转变换后的图像。

3. 缩放变换(scaling):通过缩放变换,我们可以将图像或物体按照一定的比例进行放大或缩小。

在OpenCV中,可以使用`cv2.resize`函数来实现缩放变换。

该函数接受一个输入图像和输出图像的大小作为参数,返回经过缩放变换后的图像。

4. 仿射变换(affine transformation):通过仿射变换,我们可以对图像或物体进行平移、旋转和缩放等多个操作的组合。

在OpenCV 中,可以使用`cv2.getAffineTransform`函数来获取仿射矩阵,然后使用`cv2.warpAffine`函数进行仿射变换。

该函数接受一个输入图像、一个仿射矩阵和输出图像的大小作为参数,返回经过仿射变换后的图像。

除了上述函数之外,OpenCV还提供了其他一些函数来实现更复杂的坐标变换,如透视变换(perspective transformation)和反向变换(inverse transformation)等。

opencv函数

opencv函数

imread 读图namedWindow 产生一个被命名的窗口imshow 显示图像using namespace 全局的命名空间,可以避免导致全局命名冲突问题。

cv表示opencv的命名空间std是标准输入输出的命名空间waitKey 程序运行等待时间ms为单位#include<opencv2/highgui/highgui.hpp> 包含输入输出操作#include<iostream> VC的标准输入输出cout << 输出cin>> 输入均以endl结尾#include<string> 字符串库cvtColor 彩色图像变灰度图像imwrite 写出图像F9设置断点F5调试运行后点击变量中的+显示数据结构argv[1]的定位方式为:在工程属性中,命令行参数添加路径,例如:#include<opencv2/core/core.hpp> 定义的基本构建块库Mat 基本图像容器,是一个矩阵类。

用法:Mat A; //定义矩阵Mat B(A);//复制A矩阵数据给BMat D(A,Rect(10, 10, 100, 100)); //将A矩阵的一个区域给DMat F = A.clone();//复制A矩阵数据给FMat M(2,2,CV_8UC3,Scalar(0,0,255));//创建一个矩阵,2×2大小,数据结构为CV_[每个数据占用BIT][Signed or Unsigned][Type Prefix]C[取前几个数或书写几遍] Scalar数据向量。

Signed有符号:8位数据范围为:-128~127Unsigned无符号:8位数据范围为:0~255Mat::eye(4, 4,CV_64F) //单位矩阵Mat::ones(2, 2,CV_32F) //全1矩阵Mat::zeros(3,3,CV_8UC1) //全0矩阵Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);//常规矩阵定义randu(R,Scalar::all(0),Scalar::all(255));//任意矩阵的生成Point2f P(5, 1);//定义二维点Point3f P3f(2, 6, 7); //定义三维点vector<float> v;//定义浮点数向量vector<Point2f> vPoints(20);//定义点坐标(二维数据)向量uchar就是uint8加注const 不能改变参数值;sizeof 读取大小I.channels(); //图像维数I.rows; //图像的行数I.cols;//图像的列数I.depth();//图像的深度对于图像的点式处理:uchar* p;//定义一个uint8图像for(i = 0;i < nRows; ++i){p = I.ptr<uchar>(i); //将每一行的向量赋给pfor (j = 0;j < nCols; ++j){p[j] = table[p[j]];//对每一行的向量,每一列的元素进行赋值,table是变换好的数组}}或者:uchar* p = I.data;//将图像的数据空间给pfor( unsigned int i =0;i < ncol*nrows; ++i)*p++ = table[*p];//*p中存储了图像的数据,一个一个赋值或者:LUT(I,lookUpTable,J); //效率最高的读图方式Mat lookUpTable(1, 256,CV_8U);uchar * p2 = lookUpTable.data;for( int i = 0;i < 256; ++i)p2[i] = table[i];图像的RGB分离:const int channels = I.channels();switch(channels){case 1:{MatIterator_<uchar> it,end;//灰度图像的变换for(it = I.begin<uchar>(),end = I.end<uchar>();it != end; ++it)*it = table[*it];break;}case 3:{MatIterator_<Vec3b> it,end;//RGB图像的变换for(it = I.begin<Vec3b>(),end = I.end<Vec3b>();it != end; ++it)//<Vec3b>指三列向量,即三个通道分量{(*it)[0] = table[(*it)[0]];//B分量(*it)[1] = table[(*it)[1]]; //G分量(*it)[2] = table[(*it)[2]]; //R分量}}}或者:case 3:{Mat_<Vec3b> _I = I;for( int i = 0;i < I.rows; ++i)for( int j = 0;j < I.cols; ++j){_I(i,j)[0] = table[_I(i,j)[0]];_I(i,j)[1] = table[_I(i,j)[1]];_I(i,j)[2] = table[_I(i,j)[2]];}I = _I;break;}Mat& ScanImageAndReduceC(Mat& I, const uchar* const table)//看图函数Mat& ScanImageAndReduceIterator(Mat& I, const uchar* const table) //看图函数Mat& ScanImageAndReduceRandomAccess(Mat& I, const uchar* const table) //看图函数模板运算:void Sharpen(const Mat& myImage, Mat& Result) //图像锐化函数CV_Assert(myImage.depth() == CV_8U); //判决图像是否是整型的数据Result.create(myImage.size(),myImage.type());//创建MAT矩阵类型执行算法:for(int j = 1 ;j < myImage.rows-1; ++j){const uchar* previous = myImage.ptr<uchar>(j - 1);const uchar* current = myIma ge.ptr<uchar>(j);const uchar* next = myImage.ptr<uchar>(j + 1);uchar* output = Result.ptr<uchar>(j);for(int i= nChannels;i < nChannels*(myImage.cols-1); ++i){*output++ = saturate_cast<uchar>(5*current[i]-current[i-nChannels] - current[i+nChannels] - previous[i] - next[i]);}}Result.row(0).setTo(Scalar(0));//将0行的像素值设为0或者:Mat kern = (Mat_<char>(3,3) << 0, -1, 0,-1, 5, -1,0, -1, 0);filter2D(I,K,I.depth(),kern);//使用模板滤波锐化图像,该函数所在库为<opencv2/imgproc/imgproc.hpp>图像融合算法:addWeighted(src1,alpha,src2,beta, 0.0,dst);//融合函数,需两幅图像一样大图像的亮度调整算法:相应的代码for( int y = 0;y < image.rows;y++ ){ for( int x = 0;x < image.cols;x++ ){ for( int c = 0;c < 3;c++ ) //三个通道分别运算{new_image.at<Vec3b>(y,x)[c] =saturate_cast<uchar>(alpha*(image.at<Vec3b>(y,x)[c]) + beta);}}}Mat::zeros(image.size(),image.type());//创建0阵image.convertTo(new_image, -1,alpha,beta);//线性图像变换图元:Point pt = Point(10, 8);//点的坐标Scalar(B,G,R) ;//给出像素的颜色值ellipse( img,Point(x,y),Size(x,y), angle,0, 360,Scalar( 255, 0, 0 ),thickness, lineType );//画椭圆,img图像名,point中心点,size大小,angle角度,0,起始点角度,360终点角度,scalar色彩,thickness线宽(-1为全填充),lineType 线型;调用时凡是给定的参数不管,只需给出其他参数,例如Ellipse( atom_image, 90 );给出了图像名和角度,其他量为已知。

opencv 坐标系转换 函数

opencv 坐标系转换 函数

opencv 坐标系转换函数
OpenCV坐标系转换函数是用来将不同坐标系下的点进行转换的函数。

在计算机视觉中,不同的坐标系有不同的应用场景,例如摄像头坐标系、图像坐标系、世界坐标系等。

因此,坐标系转换函数是非常常用的功能。

常见的坐标系转换函数包括:
1. cv
2.projectPoints:将三维点投影到二维平面上。

2. cv2.undistortPoints:去畸变,将图像上的点转换到归一化平面上。

3. cv2.fisheye.undistortPoints:去鱼眼畸变。

4. cv2.perspectiveTransform:透视变换,将三维点在透视空间中的坐标转换为二维平面上的坐标。

5. cv2.warpAffine:仿射变换,将图像进行平移、旋转和缩放等操作。

6. cv2.warpPerspective:透视变换,将图像进行透视变换。

7. cv2.remap:根据映射表对图像进行重映射。

以上是常见的坐标系转换函数,使用时需要根据具体的需求选择合适的函数,并且了解不同坐标系的定义和转换关系。

- 1 -。

opencv所有函数汇总

opencv所有函数汇总

opencv所有函数汇总OpenCV是一个开放源代码的计算机视觉和机器学习软件库。

它拥有多种函数和方法,可用于处理图像和视频、目标检测、特征提取、图像分割、图像配准、机器学习等多个领域。

以下是一些常用的OpenCV函数的汇总:1. cv2.imread该函数读取图像文件,并返回一个NumPy数组,该数组表示图像的像素值。

2. cv2.imshow用于在窗口中显示图像。

3. cv2.imwrite将图像保存到指定的文件路径。

4. cv2.cvtColor用于将图像从一个颜色空间转换为另一个颜色空间。

5. cv2.resize可用于调整图像的大小。

6. cv2.flip用于翻转图像。

7. cv2.rectangle绘制矩形框。

8. cv2.circle绘制圆形。

9. cv2.line绘制线条。

10. cv2.putText在图像上绘制文本。

11. cv2.threshold将图像分割为黑白两个阈值。

12. cv2.adaptiveThreshold根据图像不同区域的光照条件对图像进行阈值处理。

13. cv2.medianBlur对图像进行中值滤波。

14. cv2.GaussianBlur对图像进行高斯模糊。

15. cv2.bilateralFilter对图像进行双边滤波。

16. cv2.contourArea计算轮廓的面积。

17. cv2.findContours找到图像中的轮廓。

18. cv2.drawContours在图像上绘制轮廓。

19. cv2.matchTemplate在图像中查找指定模板的匹配项。

20. cv2.HoughCircles在图像中检测圆。

21. cv2.HoughLines在图像中检测直线。

22. cv2.goodFeaturesToTrack在图像中寻找角点。

23. cv2.findHomography计算两个图像之间的单应性矩阵。

24. cv2.warpPerspective将图像进行透视变换。

opencv常用函数

opencv常用函数

01、cv‎L oad:‎矩阵读取;‎102、‎c vOpe‎n File‎S tora‎g e:为读‎/写打开存‎储文件;‎103、c‎v Rele‎a seFi‎l eSto‎r age:‎释放存储的‎数据;1‎04、cv‎S tart‎W rite‎S truc‎t:开始写‎入新的数据‎结构;1‎05、cv‎E ndWr‎i teSt‎r uct:‎结束写入数‎据结构;‎106、c‎v Writ‎e Int:‎写入整数型‎;107‎、cvWr‎i teRe‎a l:写入‎浮点型;‎108、c‎v Writ‎e Stri‎n g:写入‎字符型;‎109、c‎v Writ‎e Comm‎e nt:写‎一个XML‎或YAML‎的注释字串‎;110‎、cvWr‎i te:写‎一个对象;‎11‎1、cvW‎r iteR‎a wDat‎a:写入多‎个数值;‎112、c‎v Writ‎e File‎N ode:‎将文件节点‎写入另一个‎文件存储器‎;113‎、cvGe‎t Root‎F ileN‎o de:获‎取存储器最‎顶层的节点‎;114‎、cvGe‎t File‎N odeB‎y Name‎:在映图或‎存储器中找‎到相应节点‎;115‎、cvGe‎t Hash‎e dKey‎:为名称返‎回一个惟一‎的指针;‎116、c‎v GetF‎i leNo‎d e:在映‎图或文件存‎储器中找到‎节点;1‎17、cv‎G etFi‎l eNod‎e Name‎:返回文件‎的节点名;‎118、‎c vRea‎d Int:‎读取一个无‎名称的整数‎型;11‎9、cvR‎e adIn‎t ByNa‎m e:读取‎一个有名称‎的整数型;‎120、‎c vRea‎d Real‎:读取一个‎无名称的浮‎点型;‎121、‎c vRea‎d Real‎B yNam‎e:读取一‎个有名称的‎浮点型;‎122、c‎v Read‎S trin‎g:从文件‎节点中寻找‎字符串;‎123、c‎v Read‎S trin‎g ByNa‎m e:找到‎一个有名称‎的文件节点‎并返回它;‎124、‎c vRea‎d:将对象‎解码并返回‎它的指针;‎125、‎c vRea‎d ByNa‎m e:找到‎对象并解码‎;126‎、cvRe‎a dRaw‎D ata:‎读取多个数‎值;12‎7、cvS‎t artR‎e adRa‎w Data‎:初始化文‎件节点序列‎的读取;‎128、c‎v Read‎R awDa‎t aSli‎c e:读取‎文件节点的‎内容;1‎29、cv‎G etMo‎d uleI‎n fo:检‎查IPP库‎是否已经正‎常安装并且‎检验运行是‎否正常;‎130、c‎v Resi‎z eWin‎d ow:用‎来调整窗口‎的大小;‎131‎、cvSa‎v eIma‎g e:保存‎图像;1‎32、cv‎M oveW‎i ndow‎:将窗口移‎动到其左上‎角为x,y‎的位置;‎133、c‎v Dest‎r oyAl‎l Wind‎o w:用来‎关闭所有窗‎口并释放窗‎口相关的内‎存空间;‎134、c‎v GetT‎r ackb‎a rPos‎:读取滑动‎条的值;‎135、c‎v SetT‎r ackb‎a rPos‎:设置滑动‎条的值;‎136、c‎v Grab‎F rame‎:用于快速‎将视频帧读‎入内存;‎137、c‎v Retr‎i eveF‎r ame:‎对读入帧做‎所有必须的‎处理;1‎38、cv‎C onve‎r tIma‎g e:用于‎在常用的不‎同图像格式‎之间转换;‎139、‎c vEro‎d e:形态‎腐蚀;1‎40、cv‎D ilat‎e:形态学‎膨胀;‎141、‎c vMor‎p holo‎g yEx:‎更通用的形‎态学函数;‎142、‎c vFlo‎o dFil‎l:漫水填‎充算法,用‎来进一步控‎制哪些区域‎将被填充颜‎色;14‎3、cvR‎e size‎:放大或缩‎小图像;‎144、c‎v PyrU‎p:图像金‎字塔,将现‎有的图像在‎每个维度上‎都放大两倍‎;145‎、cvPy‎r Segm‎e ntat‎i on:利‎用金字塔实‎现图像分割‎;146‎、cvTh‎r esho‎l d:图像‎阈值化;‎147、c‎v Acc:‎可以将8位‎整数类型图‎像累加为浮‎点图像;‎148、c‎v Adap‎t iveT‎h resh‎o ld:图‎像自适应阈‎值;14‎9、cvF‎i lter‎2D:图像‎卷积;1‎50、cv‎C opyM‎a keBo‎r der:‎将特定的图‎像轻微变大‎,然后以各‎种方式自动‎填充图像边‎界;15‎1、cvS‎o bel:‎图像边缘检‎测,Sob‎e l算子;‎152、‎c vLap‎l ace:‎拉普拉斯变‎换、图像边‎缘检测;‎153、c‎v Houg‎h Line‎s2:霍夫‎直线变换;‎154、‎c vHou‎g hCir‎c les:‎霍夫圆变换‎;155‎、cvRe‎m ap:图‎像重映射,‎校正标定图‎像,图像插‎值;15‎6、cvW‎a rpAf‎f ine:‎稠密仿射变‎换;15‎7、cvG‎e tQua‎d rang‎l eSub‎P ix:仿‎射变换;‎158、c‎v GetA‎f fine‎T rans‎f orm:‎仿射映射矩‎阵的计算;‎159、‎c vClo‎n eIma‎g e:将整‎个IplI‎m age结‎构复制到新‎的IplI‎m age中‎;160‎、cv2D‎R otat‎i onMa‎t rix:‎仿射映射矩‎阵的计算;‎161、‎c vTra‎n sfor‎m:稀疏仿‎射变换;‎162、c‎v Warp‎P ersp‎e ctiv‎e:密集透‎视变换(单‎应性);‎163、c‎v GetP‎e rspe‎c tive‎T rans‎f orm:‎计算透视映‎射矩阵;‎164、c‎v Pers‎p ecti‎v eTra‎n sfor‎m:稀疏透‎视变换;‎165、c‎v Cart‎T oPol‎a r:将数‎值从笛卡尔‎空间到极坐‎标(极性空‎间)进行映‎射;16‎6、cvP‎o larT‎o Cart‎:将数值从‎极性空间到‎笛卡尔空间‎进行映射;‎167、‎c vLog‎P olar‎:对数极坐‎标变换;‎168、c‎v DFT:‎离散傅里叶‎变换;1‎69、cv‎M ulSp‎e ctru‎m s:频谱‎乘法;1‎70、cv‎D CT:离‎散余弦变换‎;171‎、cvIn‎t egra‎l:计算积‎分图像;‎172、c‎v Dist‎T rans‎f orm:‎图像的距离‎变换;1‎73、cv‎E qual‎i zeHi‎s t:直方‎图均衡化;‎174、‎c vCre‎a teHi‎s t:创建‎一新直方图‎;175‎、cvMa‎k eHis‎t Head‎e rFor‎A rray‎:根据已给‎出的数据创‎建直方图;‎176、‎c vNor‎m aliz‎e Hist‎:归一化直‎方图;1‎77、cv‎T hres‎h Hist‎:直方图阈‎值函数;‎178、c‎v Calc‎H ist:‎从图像中自‎动计算直方‎图;17‎9、cvC‎o mpar‎e Hist‎:用于对比‎两个直方图‎的相似度;‎180、‎c vCal‎c EMD2‎:陆地移动‎距离(EM‎D)算法;‎181、‎c vCal‎c Back‎P roje‎c t:反向‎投影;1‎82、cv‎C alcB‎a ckPr‎o ject‎P atch‎:图块的方‎向投影;‎183、c‎v Matc‎h Temp‎l ate:‎模板匹配;‎184、‎c vCre‎a teMe‎m Stor‎a ge:用‎于创建一个‎内存存储器‎;185‎、cvCr‎e ateS‎e q:创建‎序列;1‎86、cv‎S eqIn‎v ert:‎将序列进行‎逆序操作;‎187、‎c vCvt‎S eqTo‎A rray‎:复制序列‎的全部或部‎分到一个连‎续内存数组‎中;18‎8、cvF‎i ndCo‎n tour‎s:从二值‎图像中寻找‎轮廓;1‎89、cv‎D rawC‎o ntou‎r s:绘制‎轮廓;1‎90、cv‎A ppro‎x Poly‎:使用多边‎形逼近一个‎轮廓;1‎91、cv‎C onto‎u rPer‎i mete‎r:轮廓长‎度;19‎2、cvC‎o ntou‎r sMom‎e nts:‎计算轮廓矩‎;193‎、cvMo‎m ents‎:计算Hu‎不变矩;‎194、c‎v Matc‎h Shap‎e s:使用‎矩进行匹配‎;195‎、cvIn‎i tLin‎e Iter‎a tor:‎对任意直线‎上的像素进‎行采样;‎196、c‎v Samp‎l eLin‎e:对直线‎采样;1‎97、cv‎A bsDi‎f f:帧差‎;198‎、cvWa‎t ersh‎e d:分水‎岭算法;‎199、c‎v Inpa‎i nt:修‎补图像;‎200、c‎v Good‎F eatu‎r esTo‎T rack‎:寻找角点‎;201‎、cvFi‎n dCor‎n erSu‎b Pix:‎用于发现亚‎像素精度的‎角点位置;‎202、‎c vCal‎c Opti‎c alFl‎o wLK:‎实现非金字‎塔的Luc‎a s-Ka‎n ade稠‎密光流算法‎;203‎、cvMe‎a nShi‎f t:me‎a n-sh‎i ft跟踪‎算法;2‎04、cv‎C amSh‎i ft:c‎a mshi‎f t跟踪算‎法;20‎5、cvC‎r eate‎K alma‎n:创建K‎a lman‎滤波器;‎206、c‎v Crea‎t eCon‎D ensa‎t ion:‎创建con‎d ensa‎t ion滤‎波器;2‎07、cv‎C onve‎r tPoi‎n tsHo‎m ogen‎i ous:‎对齐次坐标‎进行转换;‎208、‎c vFin‎d Ches‎s boar‎d Corn‎e rs:定‎位棋盘角点‎;209‎、cvFi‎n dHom‎o grap‎h y:计算‎单应性矩阵‎;210‎、cvRo‎d rigu‎e s2:罗‎德里格斯变‎换;21‎1、cvF‎i tLin‎e:直线拟‎合算法;‎212、c‎v Calc‎C ovar‎M atri‎x:计算协‎方差矩阵;‎213、‎c vInv‎e rt:计‎算协方差矩‎阵的逆矩阵‎;214‎、cvMa‎h alan‎o bis:‎计算Mah‎a lano‎b is距离‎;215‎、cvKM‎e ans2‎:K均值;‎216、‎c vClo‎n eMat‎:根据一个‎已有的矩阵‎创建一个新‎矩阵;2‎17、cv‎P reCo‎r nerD‎e tect‎:计算用于‎角点检测的‎特征图;‎218、c‎v GetI‎m age:‎C vMat‎图像数据格‎式转换成I‎p lIma‎g e图像数‎据格式;‎219、c‎v MatM‎u l:两矩‎阵相乘;‎。

opencv库常用函数

opencv库常用函数

opencv库常⽤函数常⽤opencv函数:1、cv2.line():画线——参数依次为:图⽚路径,起点和终点坐标值,颜⾊(rgb),线条宽度(像素)2、dst = cvtColor(src,code,dst=None,dstCn=None):颜⾊空间转换函数——参数依次为(原图像,color转化代码,输出图像,输出通道), 返回转换后的图像3、ret, dst = cv2.threshold(src, thresh, maxval, type):固定阈值⼆值化——src:输⼊图,只能输⼊单通道图像,通常来说为灰度图dst:输出图thresh:阈值maxval:当像素值超过了阈值(或者⼩于阈值,根据type来决定),所赋予的值type:⼆值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV4、cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]]) :查找检测物体的轮廓opencv2返回两个值:contours:hierarchy。

注:opencv3会返回三个值,分别是img, countours, hierarchy参数:第⼀个参数是寻找轮廓的图像;第⼆个参数表⽰轮廓的检索模式,有四种(本⽂介绍的都是新的cv2接⼝):cv2.RETR_EXTERNAL 表⽰只检测外轮廓cv2.RETR_LIST 检测的轮廓不建⽴等级关系cv2.RETR_CCOMP 建⽴两个等级的轮廓,上⾯的⼀层为外边界,⾥⾯的⼀层为内孔的边界信息。

如果内孔内还有⼀个连通物体,这个物体的边界也在顶层。

cv2.RETR_TREE 建⽴⼀个等级树结构的轮廓。

第三个参数method为轮廓的近似办法cv2.CHAIN_APPROX_NONE 存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1cv2.CHAIN_APPROX_SIMPLE 压缩⽔平⽅向,垂直⽅向,对⾓线⽅向的元素,只保留该⽅向的终点坐标,例如⼀个矩形轮廓只需4个点来保存轮廓信息cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS 使⽤teh-Chinl chain 近似算法返回值cv2.findContours()函数返回两个值,⼀个是轮廓本⾝,还有⼀个是每条轮廓对应的属性。

opencv腐蚀膨胀函数

opencv腐蚀膨胀函数

opencv腐蚀膨胀函数1. cv::erode。

该函数将图像进行腐蚀操作,即将图像中的白色区域缩小或消失,黑色区域扩大或保持不变。

腐蚀使用的结构元素可以是矩形、椭圆、十字形等。

函数原型:cv::erode(输入图像, 输出图像, 结构元素, 锚点, 迭代次数, 边界类型, 边界值);。

参数解析:-输入图像:腐蚀操作的原图像。

-输出图像:腐蚀操作的结果图像。

-结构元素:腐蚀操作使用的结构元素,可以是矩形、椭圆、十字形等。

-锚点:结构元素的锚点位置,默认为结构元素中心。

-迭代次数:进行腐蚀操作的迭代次数,默认为1。

- 边界类型:边界的处理方式,可以是cv::BORDER_CONSTANT、cv::BORDER_REPLICATE、cv::BORDER_REFLECT等。

- 边界值:当边界类型为cv::BORDER_CONSTANT时,设置边界的填充值,默认为0。

2. cv::dilate。

该函数将图像进行膨胀操作,即将图像中的黑色区域缩小或消失,白色区域扩大或保持不变。

膨胀使用的结构元素可以是矩形、椭圆、十字形等。

函数原型:cv::dilate(输入图像, 输出图像, 结构元素, 锚点, 迭代次数, 边界类型, 边界值);。

参数解析:-输入图像:膨胀操作的原图像。

-输出图像:膨胀操作的结果图像。

-结构元素:膨胀操作使用的结构元素,可以是矩形、椭圆、十字形等。

-锚点:结构元素的锚点位置,默认为结构元素中心。

-迭代次数:进行膨胀操作的迭代次数,默认为1。

- 边界类型:边界的处理方式,可以是cv::BORDER_CONSTANT、cv::BORDER_REPLICATE、cv::BORDER_REFLECT等。

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

Opencv函数分配图像空间:IplImage*cvCreateImage(CvSize size,int depth,int channels);size:cvSize(width,height);depth:IPL_DEPTH_8U,IPL_DEPTH_8S,IPL_DEPTH_16U,IPL_DEPTH_16S,IPL_DEPTH_32S,IPL_DEPTH_32F, IPL_DEPTH_64Fchannels:1,2,3or4.注意数据为交叉存取.彩色图像的数据编排为b0g0r0b1g1 r1...举例://分配一个单通道字节图像IplImage*img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);//分配一个三通道浮点图像IplImage*img2=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);释放图像空间:IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); cvReleaseImage(&img);复制图像:IplImage*img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); IplImage*img2;img2=cvCloneImage(img1);设定/获取兴趣区域:void cvSetImageROI(IplImage*image,CvRect rect);void cvResetImageROI(IplImage*image);vRect cvGetImageROI(const IplImage*image);大部分OpenCV函数都支持ROI.设定/获取兴趣通道:void cvSetImageCOI(IplImage*image,int coi);//0=allint cvGetImageCOI(const IplImage*image);大部分OpenCV函数暂不支持COI.读取存储图像从文件中载入图像:IplImage*img=0;img=cvLoadImage(fileName);if(!img)printf("Could not load image file:%s\n",fileName);Supported image formats:BMP,DIB,JPEG,JPG,JPE,PNG,PBM,PGM, PPM,SR,RAS, TIFF,TIF载入图像默认转为3通道彩色图像.如果不是,则需加flag:img=cvLoadImage(fileName,flag);flag:>0载入图像转为三通道彩色图像=0载入图像转为单通道灰度图像<0不转换载入图像(通道数与图像文件相同).图像存储为图像文件:if(!cvSaveImage(outFileName,img))printf("Could not save:%s\n",outFileName);输入文件格式由文件扩展名决定.存取图像元素假设需要读取在i行j列像点的第k通道.其中,行数i的范围为[0,height-1],列数j的范围为[0,width-1],通道k的范围为[0,nchannels-1].间接存取:(比较通用,但效率低,可读取任一类型图像数据)对单通道字节图像:CvScalar s;s=cvGet2D(img,i,j);//get the(i,j)pixel valueprintf("intensity=%f\n",s.val[0]);s.val[0]=111;cvSet2D(img,i,j,s);//set the(i,j)pixel value对多通道浮点或字节图像:IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); CvScalar s;s=cvGet2D(img,i,j);//get the(i,j)pixel valueprintf("B=%f,G=%f,R=%f\n",s.val[0],s.val[1],s.val[2]);s.val[0]=111;s.val[1]=111;s.val[2]=111;cvSet2D(img,i,j,s);//set the(i,j)pixel value直接存取:(效率高,但容易出错)对单通道字节图像:IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); ((uchar*)(img->imageData+i*img->widthStep))[j]=111;对多通道字节图像:IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); ((uchar*)(img->imageData+i*img->widthStep))[j*img->nChannels+ 0]=111;//B((uchar*)(img->imageData+i*img->widthStep))[j*img->nChannels+ 1]=112;//G((uchar*)(img->imageData+i*img->widthStep))[j*img->nChannels+ 2]=113;//R对多通道浮点图像:((float*)(img->imageData+i*img->widthStep))[j*img->nChannels+0]=111;//B((float*)(img->imageData+i*img->widthStep))[j*img->nChannels+1]=112;//G((float*)(img->imageData+i*img->widthStep))[j*img->nChannels+2]=113;//R用指针直接存取:(在某些情况下简单高效)对单通道字节图像:IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); int height=img->height;int width=img->width;int step=img->widthStep/sizeof(uchar);uchar*data=(uchar*)img->imageData;data[i*step+j]=111;对多通道字节图像:IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); int height=img->height;int width=img->width;int step=img->widthStep/sizeof(uchar);int channels=img->nChannels;uchar*data=(uchar*)img->imageData;data[i*step+j*channels+k]=111;对单通道浮点图像(假设用4字节调整):IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); int height=img->height;int width=img->width;int step=img->widthStep/sizeof(float);int channels=img->nChannels;float*data=(float*)img->imageData;data[i*step+j*channels+k]=111;使用c++wrapper进行直接存取:(简单高效)对单/多通道字节图像,多通道浮点图像定义一个c++wrapper:template<class T>class Image{private:IplImage*imgp;public:Image(IplImage*img=0){imgp=img;}~Image(){imgp=0;}void operator=(IplImage*img){imgp=img;}inline T*operator[](const int rowIndx){return((T*)(imgp->imageData+rowIndx*imgp->widthStep));} };typedef struct{unsigned char b,g,r;}RgbPixel;typedef struct{float b,g,r;}RgbPixelFloat;typedef Image<RgbPixel>RgbImage;typedef Image<RgbPixelFloat>RgbImageFloat;typedef Image<unsigned char>BwImage;typedef Image<float>BwImageFloat;单通道字节图像:IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); BwImage imgA(img);imgA[i][j]=111;多通道字节图像:IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); RgbImage imgA(img);imgA[i][j].b=111;imgA[i][j].g=111;imgA[i][j].r=111;多通道浮点图像:IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); RgbImageFloat imgA(img);imgA[i][j].b=111;imgA[i][j].g=111;imgA[i][j].r=111;图像转换转为灰度或彩色字节图像:cvConvertImage(src,dst,flags=0);src=float/byte grayscale/color imagedst=byte grayscale/color imageflags=CV_CVTIMG_FLIP(flip vertically)CV_CVTIMG_SWAP_RB(swap the R and B channels)转换彩色图像为灰度图像:使用OpenCV转换函数:cvCvtColor(cimg,gimg,CV_BGR2GRAY);//cimg->gimg直接转换:for(i=0;i<cimg->height;i++)for(j=0;j<cimg->width;j++)gimgA[i][j]=(uchar)(cimgA[i][j].b*0.114+cimgA[i][j].g*0.587+cimgA[i][j].r*0.299) ;颜色空间转换:cvCvtColor(src,dst,code);//src->dstcode=CV_<X>2<Y><X>/<Y>=RGB,BGR,GRAY,HSV,YCrCb,XYZ,Lab,Luv,HLSe.g.:CV_BGR2GRAY,CV_BGR2HSV,CV_BGR2Lab绘图命令画长方体://用宽度为1的红线在(100,100)与(200,200)之间画一长方体cvRectangle(img,cvPoint(100,100),cvPoint(200,200),cvScalar(255,0,0), 1);画圆://在(100,100)处画一半径为20的圆,使用宽度为1的绿线cvCircle(img,cvPoint(100,100),20,cvScalar(0,255,0),1);画线段://在(100,100)与(200,200)之间画绿色线段,宽度为1cvLine(img,cvPoint(100,100),cvPoint(200,200),cvScalar(0,255,0),1);画一组线段:CvPoint curve1[]={10,10,10,100,100,100,100,10};CvPoint curve2[]={30,30,30,130,130,130,130,30,150,10};CvPoint*curveArr[2]={curve1,curve2};int nCurvePts[2]={4,5};int nCurves=2;int isCurveClosed=1;int lineWidth=1;cvPolyLine(img,curveArr,nCurvePts,nCurves,isCurveClosed,cvScalar(0,25 5,255),lineWidth);画内填充色的多边形:cvFillPoly(img,curveArr,nCurvePts,nCurves,cvScalar(0,255,255));添加文本:CvFont font;double hScale=1.0;double vScale=1.0;int lineWidth=1;cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC,hScale,vScale,0,lineWidth);cvPutText(img,"My comment",cvPoint(200,400),&font,cvScalar(255,255,0));Other possible fonts:CV_FONT_HERSHEY_SIMPLEX,CV_FONT_HERSHEY_PLAIN,CV_FONT_HERSHEY_DUPLEX,CV_FONT_HERSHEY_COMPLEX,CV_FONT_HERSHEY_TRIPLEX,CV_FONT_HERSHEY_COMPLEX_SMALL,CV_FONT_HERSHEY_SCRIPT_SIMPLEX,CV_FONT_HERSHEY_SCRIPT_COMPLEX,综述:OpenCV有针对矩阵操作的C语言函数.许多其他方法提供了更加方便的C++接口,其效率与OpenCV一样.OpenCV将向量作为1维矩阵处理.矩阵按行存储,每行有4字节的校整.分配矩阵空间:CvMat*cvCreateMat(int rows,int cols,int type);type:矩阵元素类型.格式为CV_<bit_depth>(S|U|F)C<number_of_channels>.例如:CV_8UC1表示8位无符号单通道矩阵,CV_32SC2表示32位有符号双通道矩阵.例程:CvMat*M=cvCreateMat(4,4,CV_32FC1);释放矩阵空间:CvMat*M=cvCreateMat(4,4,CV_32FC1);cvReleaseMat(&M);复制矩阵:CvMat*M1=cvCreateMat(4,4,CV_32FC1);CvMat*M2;M2=cvCloneMat(M1);初始化矩阵:double a[]={1,2,3,4,5,6,7,8,9,10,11,12};CvMat Ma=cvMat(3,4,CV_64FC1,a);另一种方法:CvMat Ma;cvInitMatHeader(&Ma,3,4,CV_64FC1,a);初始化矩阵为单位阵:CvMat*M=cvCreateMat(4,4,CV_32FC1);cvSetIdentity(M);//这里似乎有问题,不成功存取矩阵元素假设需要存取一个2维浮点矩阵的第(i,j)个元素.间接存取矩阵元素:cvmSet(M,i,j,2.0);//Set M(i,j)t=cvmGet(M,i,j);//Get M(i,j)直接存取,假设使用4-字节校正:CvMat*M=cvCreateMat(4,4,CV_32FC1);int n=M->cols;float*data=M->data.fl;data[i*n+j]=3.0;直接存取,校正字节任意:CvMat*M=cvCreateMat(4,4,CV_32FC1);int step=M->step/sizeof(float);float*data=M->data.fl;(data+i*step)[j]=3.0;直接存取一个初始化的矩阵元素:double a[16];CvMat Ma=cvMat(3,4,CV_64FC1,a);a[i*4+j]=2.0;//Ma(i,j)=2.0;矩阵/向量操作矩阵-矩阵操作:CvMat*Ma,*Mb,*Mc;cvAdd(Ma,Mb,Mc);//Ma+Mb->Mc cvSub(Ma,Mb,Mc);//Ma-Mb->Mc cvMatMul(Ma,Mb,Mc);//Ma*Mb->Mc按元素的矩阵操作:CvMat*Ma,*Mb,*Mc;cvMul(Ma,Mb,Mc);//Ma.*Mb->Mc cvDiv(Ma,Mb,Mc);//Ma./Mb->Mc cvAddS(Ma,cvScalar(-10.0),Mc);//Ma.-10->Mc向量乘积:double va[]={1,2,3};double vb[]={0,0,1};double vc[3];CvMat Va=cvMat(3,1,CV_64FC1,va);CvMat Vb=cvMat(3,1,CV_64FC1,vb);CvMat Vc=cvMat(3,1,CV_64FC1,vc);double res=cvDotProduct(&Va,&Vb);//点乘:Va.Vb->res cvCrossProduct(&Va,&Vb,&Vc);//向量积:Va x Vb->Vcend{verbatim}注意Va,Vb,Vc在向量积中向量元素个数须相同.单矩阵操作:CvMat*Ma,*Mb;cvTranspose(Ma,Mb);//transpose(Ma)->Mb(不能对自身进行转置)CvScalar t=cvTrace(Ma);//trace(Ma)->t.val[0]double d=cvDet(Ma);//det(Ma)->dcvInvert(Ma,Mb);//inv(Ma)->Mb非齐次线性系统求解:CvMat*A=cvCreateMat(3,3,CV_32FC1);CvMat*x=cvCreateMat(3,1,CV_32FC1);CvMat*b=cvCreateMat(3,1,CV_32FC1);cvSolve(&A,&b,&x);//solve(Ax=b)for x特征值分析(针对对称矩阵):CvMat*A=cvCreateMat(3,3,CV_32FC1);CvMat*E=cvCreateMat(3,3,CV_32FC1);CvMat*l=cvCreateMat(3,1,CV_32FC1);cvEigenVV(&A,&E,&l);//l=A的特征值(降序排列)//E=对应的特征向量(每行)奇异值分解SVD:CvMat*A=cvCreateMat(3,3,CV_32FC1);CvMat*U=cvCreateMat(3,3,CV_32FC1);CvMat*D=cvCreateMat(3,3,CV_32FC1);CvMat*V=cvCreateMat(3,3,CV_32FC1);cvSVD(A,D,U,V,CV_SVD_U_T|CV_SVD_V_T);//A=U D V^T 标号使得U和V返回时被转置(若没有转置标号,则有问题不成功!!!).视频序列操作从视频序列中抓取一帧OpenCV支持从摄像头或视频文件(AVI)中抓取图像.从摄像头获取初始化:CvCapture*capture=cvCaptureFromCAM(0);//capture from video device #0从视频文件获取初始化:CvCapture*capture=cvCaptureFromAVI("infile.avi");抓取帧:IplImage*img=0;if(!cvGrabFrame(capture)){//抓取一帧printf("Could not grab a frame\n\7");exit(0);}img=cvRetrieveFrame(capture);//恢复获取的帧图像要从多个摄像头同时获取图像,首先从每个摄像头抓取一帧.在抓取动作都结束后再恢复帧图像.释放抓取源:cvReleaseCapture(&capture);注意由设备抓取的图像是由capture函数自动分配和释放的.不要试图自己释放它.获取/设定帧信息获取设备特性:cvQueryFrame(capture);//this call is necessary to get correct//capture properties int frameH=(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT);int frameW=(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH);int fps=(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);int numFrames=(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_COUNT);所有帧数似乎只与视频文件有关.用摄像头时不对,奇怪!!!.获取帧信息:float posMsec=cvGetCaptureProperty(capture, CV_CAP_PROP_POS_MSEC);int posFrames=(int)cvGetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES);float posRatio=cvGetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO);获取所抓取帧在视频序列中的位置,从首帧开始按[毫秒]算.或者从首帧开始从0标号,获取所抓取帧的标号.或者取相对位置,首帧为0,末帧为1,只对视频文件有效.设定所抓取的第一帧标号://从视频文件相对位置0.9处开始抓取cvSetCaptureProperty(capture,CV_CAP_PROP_POS_AVI_RATIO,(double)0.9);只对从视频文件抓取有效.不过似乎也不成功!!!存储视频文件初始化视频存储器:CvVideoWriter*writer=0;int isColor=1;int fps=25;//or30int frameW=640;//744for firewire camerasint frameH=480;//480for firewire cameraswriter=cvCreateVideoWriter("out.avi",CV_FOURCC('P','I','M','1'),fps,cvSize(f rameW,frameH),isColor);其他有效编码:CV_FOURCC('P','I','M','1')=MPEG-1codecCV_FOURCC('M','J','P','G')=motion-jpeg codec(does not work well)CV_FOURCC('M','P','4','2')=MPEG-4.2codecCV_FOURCC('D','I','V','3')=MPEG-4.3codecCV_FOURCC('D','I','V','X')=MPEG-4codecCV_FOURCC('U','2','6','3')=H263codecCV_FOURCC('I','2','6','3')=H263I codecCV_FOURCC('F','L','V','1')=FLV1codec若把视频编码设为-1则将打开一个编码选择窗口(windows系统下).存储视频文件:IplImage*img=0;int nFrames=50;for(i=0;i<nFrames;i++){cvGrabFrame(capture);//抓取帧img=cvRetrieveFrame(capture);//恢复图像cvWriteFrame(writer,img);//将帧添加入视频文件}若想在抓取中查看抓取图像,可在循环中加入下列代码:cvShowImage("mainWin",img);key=cvWaitKey(20);//wait20ms 若没有20[毫秒]延迟,将无法正确显示视频序列.释放视频存储器:cvReleaseVideoWriter(&writer);。

相关文档
最新文档