OPENCV函数
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提供了一些函数来实现坐标变换,包括平移、旋转、缩放和仿射变换等。
下面将逐个介绍这些函数的用法和作用。
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函数
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坐标系转换函数是用来将不同坐标系下的点进行转换的函数。
在计算机视觉中,不同的坐标系有不同的应用场景,例如摄像头坐标系、图像坐标系、世界坐标系等。
因此,坐标系转换函数是非常常用的功能。
常见的坐标系转换函数包括:
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函数的汇总: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常用函数
01、cvL oad:矩阵读取;102、c vOpen FileS torag e:为读/写打开存储文件;103、cv Relea seFil eStor age:释放存储的数据;104、cvS tartW riteS truct:开始写入新的数据结构;105、cvE ndWri teStr uct:结束写入数据结构;106、cv Write Int:写入整数型;107、cvWri teRea l:写入浮点型;108、cv Write Strin g:写入字符型;109、cv Write Comme nt:写一个XML或YAML的注释字串;110、cvWri te:写一个对象;111、cvWr iteRa wData:写入多个数值;112、cv Write FileN ode:将文件节点写入另一个文件存储器;113、cvGet RootF ileNo de:获取存储器最顶层的节点;114、cvGet FileN odeBy Name:在映图或存储器中找到相应节点;115、cvGet Hashe dKey:为名称返回一个惟一的指针;116、cv GetFi leNod e:在映图或文件存储器中找到节点;117、cvG etFil eNode Name:返回文件的节点名;118、c vRead Int:读取一个无名称的整数型;119、cvRe adInt ByNam e:读取一个有名称的整数型;120、c vRead Real:读取一个无名称的浮点型;121、c vRead RealB yName:读取一个有名称的浮点型;122、cv ReadS tring:从文件节点中寻找字符串;123、cv ReadS tring ByNam e:找到一个有名称的文件节点并返回它;124、c vRead:将对象解码并返回它的指针;125、c vRead ByNam e:找到对象并解码;126、cvRea dRawD ata:读取多个数值;127、cvSt artRe adRaw Data:初始化文件节点序列的读取;128、cv ReadR awDat aSlic e:读取文件节点的内容;129、cvG etMod uleIn fo:检查IPP库是否已经正常安装并且检验运行是否正常;130、cv Resiz eWind ow:用来调整窗口的大小;131、cvSav eImag e:保存图像;132、cvM oveWi ndow:将窗口移动到其左上角为x,y的位置;133、cv Destr oyAll Windo w:用来关闭所有窗口并释放窗口相关的内存空间;134、cv GetTr ackba rPos:读取滑动条的值;135、cv SetTr ackba rPos:设置滑动条的值;136、cv GrabF rame:用于快速将视频帧读入内存;137、cv Retri eveFr ame:对读入帧做所有必须的处理;138、cvC onver tImag e:用于在常用的不同图像格式之间转换;139、c vErod e:形态腐蚀;140、cvD ilate:形态学膨胀;141、c vMorp holog yEx:更通用的形态学函数;142、c vFloo dFill:漫水填充算法,用来进一步控制哪些区域将被填充颜色;143、cvRe size:放大或缩小图像;144、cv PyrUp:图像金字塔,将现有的图像在每个维度上都放大两倍;145、cvPyr Segme ntati on:利用金字塔实现图像分割;146、cvThr eshol d:图像阈值化;147、cv Acc:可以将8位整数类型图像累加为浮点图像;148、cv Adapt iveTh resho ld:图像自适应阈值;149、cvFi lter2D:图像卷积;150、cvC opyMa keBor der:将特定的图像轻微变大,然后以各种方式自动填充图像边界;151、cvSo bel:图像边缘检测,Sobe l算子;152、c vLapl ace:拉普拉斯变换、图像边缘检测;153、cv Hough Lines2:霍夫直线变换;154、c vHoug hCirc les:霍夫圆变换;155、cvRem ap:图像重映射,校正标定图像,图像插值;156、cvWa rpAff ine:稠密仿射变换;157、cvGe tQuad rangl eSubP ix:仿射变换;158、cv GetAf fineT ransf orm:仿射映射矩阵的计算;159、c vClon eImag e:将整个IplIm age结构复制到新的IplIm age中;160、cv2DR otati onMat rix:仿射映射矩阵的计算;161、c vTran sform:稀疏仿射变换;162、cv WarpP erspe ctive:密集透视变换(单应性);163、cv GetPe rspec tiveT ransf orm:计算透视映射矩阵;164、cv Persp ectiv eTran sform:稀疏透视变换;165、cv CartT oPola r:将数值从笛卡尔空间到极坐标(极性空间)进行映射;166、cvPo larTo Cart:将数值从极性空间到笛卡尔空间进行映射;167、c vLogP olar:对数极坐标变换;168、cv DFT:离散傅里叶变换;169、cvM ulSpe ctrum s:频谱乘法;170、cvD CT:离散余弦变换;171、cvInt egral:计算积分图像;172、cv DistT ransf orm:图像的距离变换;173、cvE quali zeHis t:直方图均衡化;174、c vCrea teHis t:创建一新直方图;175、cvMak eHist Heade rForA rray:根据已给出的数据创建直方图;176、c vNorm alize Hist:归一化直方图;177、cvT hresh Hist:直方图阈值函数;178、cv CalcH ist:从图像中自动计算直方图;179、cvCo mpare Hist:用于对比两个直方图的相似度;180、c vCalc EMD2:陆地移动距离(EMD)算法;181、c vCalc BackP rojec t:反向投影;182、cvC alcBa ckPro jectP atch:图块的方向投影;183、cv Match Templ ate:模板匹配;184、c vCrea teMem Stora ge:用于创建一个内存存储器;185、cvCre ateSe q:创建序列;186、cvS eqInv ert:将序列进行逆序操作;187、c vCvtS eqToA rray:复制序列的全部或部分到一个连续内存数组中;188、cvFi ndCon tours:从二值图像中寻找轮廓;189、cvD rawCo ntour s:绘制轮廓;190、cvA pprox Poly:使用多边形逼近一个轮廓;191、cvC ontou rPeri meter:轮廓长度;192、cvCo ntour sMome nts:计算轮廓矩;193、cvMom ents:计算Hu不变矩;194、cv Match Shape s:使用矩进行匹配;195、cvIni tLine Itera tor:对任意直线上的像素进行采样;196、cv Sampl eLine:对直线采样;197、cvA bsDif f:帧差;198、cvWat ershe d:分水岭算法;199、cv Inpai nt:修补图像;200、cv GoodF eatur esToT rack:寻找角点;201、cvFin dCorn erSub Pix:用于发现亚像素精度的角点位置;202、c vCalc Optic alFlo wLK:实现非金字塔的Luca s-Kan ade稠密光流算法;203、cvMea nShif t:mea n-shi ft跟踪算法;204、cvC amShi ft:ca mshif t跟踪算法;205、cvCr eateK alman:创建Ka lman滤波器;206、cv Creat eConD ensat ion:创建cond ensat ion滤波器;207、cvC onver tPoin tsHom ogeni ous:对齐次坐标进行转换;208、c vFind Chess board Corne rs:定位棋盘角点;209、cvFin dHomo graph y:计算单应性矩阵;210、cvRod rigue s2:罗德里格斯变换;211、cvFi tLine:直线拟合算法;212、cv CalcC ovarM atrix:计算协方差矩阵;213、c vInve rt:计算协方差矩阵的逆矩阵;214、cvMah alano bis:计算Maha lanob is距离;215、cvKMe ans2:K均值;216、c vClon eMat:根据一个已有的矩阵创建一个新矩阵;217、cvP reCor nerDe tect:计算用于角点检测的特征图;218、cv GetIm age:C vMat图像数据格式转换成Ip lImag e图像数据格式;219、cv MatMu l:两矩阵相乘;。
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腐蚀膨胀函数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等。
OPENCV库函数使用说明
OPENCV库函数使用说明
一、cv::Mat类介绍
cv::Mat类是OpenCV中最核心的基本数据结构,抽象代表一个n维矩阵,矩阵元素的矩阵可以是单通道浮点数,向量,多通道,可以是无符号字节,单精度浮点数以及双精度浮点数,并且支持多通道数据。
Mat类通过长度和宽度确定矩阵的大小,通过depth(函数可以得到它的深度,深度表示分量的类型。
Mat矩阵分为三种:关键的类型,普通的类型,宽字节类型,关键类型是由C++11语言提供的,主要用于简化mat 和其他类型的交互,它的性能比普通类型更好,但不支持所有类型;普通类型可以实现所有的功能,但是性能比关键类型要差;宽字节类型是在普通类型的基础上,支持访问1(uchar),2(ushort),4(uint)个字节长度的数据,它的性能比普通类型好。
二、cv::Mat函数使用
1.Mat类结构函数
一般来说,Mat类的结构函数主要有两种,分别是Mat()和Mat ({}),当我们只想创建一个空的Mat类时,可以使用Mat(),当想要创建一个8位单通道矩阵时,可以使用Mat({})。
2.Mat常用成员函数
(1)ptr():返回一个指向矩阵数据的指针;
(2)row():返回行数;
(3)cols():返回列数;。
opencv 画点函数
opencv 画点函数1. 介绍OpenCV是一个流行的计算机视觉库,提供了各种图像处理和计算机视觉算法。
其中,画点函数是OpenCV的基本绘图函数之一。
它可以在图像上绘制一个或多个点,用于标记关键点、特征点或目标点。
这些点可以用不同的颜色和大小进行绘制,以增强可视化效果。
本文将深入探讨OpenCV中的画点函数,详细介绍其用法、参数和示例。
通过学习这些内容,读者将能够充分理解该函数的功能,并在自己的项目中灵活应用。
2. 画点函数的基本用法画点函数在OpenCV中的函数名为cv::circle()。
它的基本用法如下:void cv::circle(InputOutputArray img, // 输入输出图像Point center, // 点的坐标int radius, // 点的半径const Scalar& color, // 点的颜色,可以是单个颜色或BGR颜色向量int thickness = 1, // 线的粗细,负数表示填充圆int lineType = LINE_8, // 线的类型,默认为8连通int shift = 0 // 坐标点的小数位数,默认为0);在上述代码中,各参数的含义如下:•img:需要绘制点的图像。
•center:点的中心坐标,可以使用cv::Point类表示,例如cv::Point(x, y)。
•radius:点的半径,单位为像素。
•color:点的颜色,可以是单个颜色值,例如cv::Scalar(0, 0, 255)表示红色,也可以是BGR颜色向量,例如cv::Scalar(255, 0, 0)表示蓝色。
•thickness:点的线条粗细,负数表示填充整个圆。
•lineType:线的类型,可以是8连通或4连通,默认为8连通。
•shift:坐标点的小数位数,默认为0。
3. 画点函数的参数详解3.1 输入输出图像img参数表示需要绘制点的图像,可以是单通道或多通道图像。
OpenCV常用库函数
OpenCV常⽤库函数⼀、core模块1、Mat - 基本图像容器Mat 是⼀个类,由两个数据部分组成:矩阵头(包含矩阵尺⼨,存储⽅法,存储地址等信息)和⼀个指向存储所有像素值的矩阵(根据所选存储⽅法的不同矩阵可以是不同的维数)的指针。
创建Mat对象⽅法:11->Mat() 构造函数:2 Mat M(2,2, CV_8UC3, Scalar(0,0,255));3int sz[3] = {2,2,2};4 Mat L(3,sz, CV_8UC(1), Scalar::all(0));52->Create() function: 函数6 M.create(4,4, CV_8UC(2));73-> 初始化zeros(), ones(), :eyes()矩阵8 Mat E = Mat::eye(4, 4, CV_64F);9 Mat O = Mat::ones(2, 2, CV_32F);10 Mat Z = Mat::zeros(3,3, CV_8UC1);114->⽤逗号分隔的初始化函数:12 Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);常⽤操作:1 Mat A, C; // 只创建信息头部分2 A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // 这⾥为矩阵开辟内存3 Mat B(A); // 使⽤拷贝构造函数4 C = A; // 赋值运算符5 Mat D (A, Rect(10, 10, 100, 100) ); // using a rectangle6 Mat E = A(Range:all(), Range(1,3)); // using row and column boundaries7 Mat F = A.clone();8 Mat G;9 A.copyTo(G); //使⽤函数 clone() 或者 copyTo() 来拷贝⼀副图像的矩阵。
opencv 基本仿射变换函数
opencv 基本仿射变换函数OpenCV是一个功能强大的开源计算机视觉库,可以使用该库在各种平台上构建基于计算机视觉的项目。
其中,仿射变换是OpenCV中的一项重要功能,可以被用于图像处理、计算机视觉等领域。
本篇文章将介绍基本的仿射变换函数及其原理。
仿射变换是一种线性变换,通过对原图像进行平移、旋转、缩放、错切等操作的组合,达到改变图像形状和位置的目的。
仿射变换可以被表示为一个二维矩阵,该矩阵包含多个变换参数,如平移量、旋转角度、缩放因子和错切参数。
OpenCV中的仿射变换函数主要有三个:cv2.getAffineTransform()、cv2.warpAffine()和cv2.transform()。
这些函数在分别实现的功能方面略有不同,下文将逐一介绍。
1. cv2.getAffineTransform(src, dst)该函数用于获得一个仿射变换矩阵,该矩阵可以被用于对图像进行仿射变换操作。
参数说明:src:一个包含三个点坐标的数组,表示原图像中的三个点。
这些点需要表示为三个二维坐标元组(x,y)。
dst:一个包含三个点坐标的数组,表示变换后的图像中对应的三个点,格式与src相同。
返回值:一个2*3的仿射变换矩阵,可以被用于cv2.warpAffine()函数中。
示例:import cv2import numpy as npimport matplotlib.pyplot as pltimg = cv2.imread('lenna.jpg')rows, cols, ch = img.shape#定义原图中的三个点src_points = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1]])#定义变换后的图像中的三个对应点dst_points = np.float32([[cols * 0.1, rows * 0.1], [cols * 0.9, rows * 0.2], [cols * 0.3, rows * 0.9]])#获得仿射变换矩阵M = cv2.getAffineTransform(src_points, dst_points)#对图像进行仿射变换dst = cv2.warpAffine(img, M, (cols, rows))#显示结果plt.subplot(121), plt.imshow(img), plt.title('Input')plt.subplot(122), plt.imshow(dst), plt.title('Output') plt.show()此处,我们先读入一张图片,并定义两组点作为src_points和dst_points参数,这两个参数将作为cv2.getAffineTransform()的输入。
opencv拷贝函数
在OpenCV中,有多种方式可以拷贝图像。
这里列举几个主要的方法:使用cv2.copy()函数:这是最直接的方法。
你可以使用cv2.copy()函数来拷贝一个图像。
这个函数会创建一个新的图像,并且复制所有像素值。
python复制代码import cv2# 读取图像image =cv2.imread('path_to_image.jpg')# 拷贝图像copied_image = image.copy()使用NumPy的切片:因为OpenCV的图像本质上是NumPy数组,所以你也可以使用NumPy的切片来拷贝图像。
这种方法也会创建一个新的图像,并且复制所有像素值。
python复制代码import cv2# 读取图像image =cv2.imread('path_to_image.jpg')# 拷贝图像copied_image = image[:, :]使用cv2.clone()函数:cv2.clone()函数与cv2.copy()相似,但它主要用于拷贝更复杂的对象,如矩阵。
对于简单的图像拷贝,cv2.copy()或NumPy切片通常更常用。
python复制代码import cv2# 读取图像image =cv2.imread('path_to_image.jpg')# 拷贝图像copied_image = cv2.clone(image)深拷贝与浅拷贝:在Python中,深拷贝和浅拷贝是两种不同的拷贝方式。
对于OpenCV中的图像,通常使用深拷贝,因为深拷贝会创建一个新的对象,并复制所有像素值。
而浅拷贝只创建一个新的引用,指向原始图像数据,不复制像素值。
因此,如果你修改了浅拷贝的图像,原始图像也会被修改。
深拷贝可以使用copy.deepcopy()来实现:python复制代码import cv2import copy# 读取图像image =cv2.imread('path_to_image.jpg')# 深拷贝图像deep_copied_image =copy.deepcopy(image)请注意,对于简单的图像数据,通常不需要使用deepcopy,因为cv2.copy()或NumPy切片已经提供了足够的深拷贝功能。
opencv的仿射变换函数
Opencv的仿射变换函数一、介绍Opencv是一个非常强大的计算机视觉库,它提供了许多函数来处理图像和视频。
其中之一就是仿射变换函数,它可以对图像进行平移、旋转、缩放和倾斜等变换操作,从而改变图像的形状和位置。
本文将详细介绍Opencv中的仿射变换函数,包括函数的使用方法、参数解释以及一些实际应用。
二、仿射变换函数的基本原理和作用仿射变换是一种线性变换,它保持了直线的性质。
简单来说,即变换前后直线上的任意两点,它们之间的中点在变换前后位置也是一样的。
Opencv中的仿射变换函数可以通过设置变换矩阵来实现图像的平移、旋转、缩放和倾斜等操作。
下面是一些常见的仿射变换操作:1. 平移变换(Translation)平移变换是指通过修改图像的位置实现平移的效果。
Opencv中的仿射变换函数cv2.warpAffine()可以通过指定平移矩阵来实现图像的平移,矩阵的形式如下:[[1, 0, dx],[0, 1, dy]]其中,dx和dy分别表示在x和y方向上的平移距离。
2. 旋转变换(Rotation)旋转变换是指通过旋转图像来改变图像的朝向。
Opencv中的仿射变换函数cv2.warpAffine()可以通过指定旋转矩阵来实现图像的旋转,矩阵的形式如下:[[cos(theta), -sin(theta)],[sin(theta), cos(theta)]]其中,theta表示旋转角度。
3. 缩放变换(Scale)缩放变换是指通过改变图像的尺寸来实现缩放的效果。
Opencv中的仿射变换函数cv2.warpAffine()可以通过指定缩放因子来实现图像的缩放,矩阵的形式如下:[[sx, 0],[0, sy]]其中,sx和sy分别表示x和y方向上的缩放因子。
4. 倾斜变换(Shearing)倾斜变换是指通过拉伸图像的一侧来改变图像的形状。
Opencv中的仿射变换函数cv2.warpAffine()可以通过指定倾斜矩阵来实现图像的倾斜,矩阵的形式如下:[[1, kx, 0],[ky, 1, 0]]其中,kx和ky分别表示x和y方向上的倾斜系数。
常用的OpenCV函数速查
1、cvLoadImage:将图像文件加载至内存;2、cvNamedWindow:在屏幕上创建一个窗口;3、cvShowImage:在一个已创建好的窗口中显示图像;4、cvWaitKey:使程序暂停,等待用户触发一个按键操作;5、cvReleaseImage:释放图像文件所分配的内存;6、cvDestroyWindow:销毁显示图像文件的窗口;7、cvCreateFileCapture:通过参数设置确定要读入的AVI文件;8、cvQueryFrame:用来将下一帧视频文件载入内存;9、cvReleaseCapture:释放CvCapture结构开辟的内存空间;10、cvCreateTrackbar:创建一个滚动条;11、cvSetCaptureProperty:设置CvCapture对象的各种属性;12、cvGetCaptureProperty:查询CvCapture对象的各种属性;13、cvGetSize:当前图像结构的大小;14、cvSmooth:对图像进行平滑处理;15、cvPyrDown:图像金字塔,降采样,图像缩小为原来四分之一;16、cvCanny:Canny边缘检测;17、cvCreateCameraCapture:从摄像设备中读入数据;18、cvCreateVideoWriter:创建一个写入设备以便逐帧将视频流写入视频文件;19、cvWriteFrame:逐帧将视频流写入文件;20、cvReleaseVideoWriter:释放CvVideoWriter结构开辟的内存空间;21、CV_MAT_ELEM:从矩阵中得到一个元素;22、cvAbs:计算数组中所有元素的绝对值;23、cvAbsDiff:计算两个数组差值的绝对值;24、cvAbsDiffS:计算数组和标量差值的绝对值;25、cvAdd:两个数组的元素级的加运算;26、cvAddS:一个数组和一个标量的元素级的相加运算;27、cvAddWeighted:两个数组的元素级的加权相加运算(alpha运算);28、cvAvg:计算数组中所有元素的平均值;29、cvAvgSdv:计算数组中所有元素的绝对值和标准差;30、cvCalcCovarMatrix:计算一组n维空间向量的协方差;31、cvCmp:对两个数组中的所有元素运用设置的比较操作;32、cvCmpS:对数组和标量运用设置的比较操作;33、cvConvertScale:用可选的缩放值转换数组元素类型;34、cvCopy:把数组中的值复制到另一个数组中;35、cvCountNonZero:计算数组中非0值的个数;36、cvCrossProduct:计算两个三维向量的向量积(叉积);37、cvCvtColor:将数组的通道从一个颜色空间转换另外一个颜色空间;38、cvDet:计算方阵的行列式;39、cvDiv:用另外一个数组对一个数组进行元素级的除法运算;40、cvDotProduct:计算两个向量的点积;41、cvEigenVV:计算方阵的特征值和特征向量;42、cvFlip:围绕选定轴翻转;43、cvGEMM:矩阵乘法;44、cvGetCol:从一个数组的列中复制元素;45、cvGetCols:从数据的相邻的多列中复制元素;46、cvGetDiag:复制数组中对角线上的所有元素;47、cvGetDims:返回数组的维数;48、cvGetDimSize:返回一个数组的所有维的大小;49、cvGetRow:从一个数组的行中复制元素值;50、cvGetRows:从一个数组的多个相邻的行中复制元素值;51、cvGetSize:得到二维的数组的尺寸,以CvSize返回;52、cvGetSubRect:从一个数组的子区域复制元素值;53、cvInRange:检查一个数组的元素是否在另外两个数组中的值的范围内;54、cvInRangeS:检查一个数组的元素的值是否在另外两个标量的范围内;55、cvInvert:求矩阵的逆;56、cvMahalonobis:计算两个向量间的马氏距离;57、cvMax:在两个数组中进行元素级的取最大值操作;58、cvMaxS:在一个数组和一个标量中进行元素级的取最大值操作;59、cvMerge:把几个单通道图像合并为一个多通道图像;60、cvMin:在两个数组中进行元素级的取最小值操作;61、cvMinS:在一个数组和一个标量中进行元素级的取最小值操作;62、cvMinMaxLoc:寻找数组中的最大最小值;63、cvMul:计算两个数组的元素级的乘积(点乘);64、cvNot:按位对数组中的每一个元素求反;65、cvNormalize:将数组中元素进行归一化;66、cvOr:对两个数组进行按位或操作;67、cvOrs:在数组与标量之间进行按位或操作;68、cvReduce:通过给定的操作符将二维数组简为向量;69、cvRepeat:以平铺的方式进行数组复制;70、cvSet:用给定值初始化数组;71、cvSetZero:将数组中所有元素初始化为0;72、cvSetIdentity:将数组中对角线上的元素设为1,其他置0;73、cvSolve:求出线性方程组的解;74、cvSplit:将多通道数组分割成多个单通道数组;75、cvSub:两个数组元素级的相减;76、cvSubS:元素级的从数组中减去标量;77、cvSubRS:元素级的从标量中减去数组;78、cvSum:对数组中的所有元素求和;79、cvSVD:二维矩阵的奇异值分解;80、cvSVBkSb:奇异值回代计算;81、cvTrace:计算矩阵迹;82、cvTranspose:矩阵的转置运算;83、cvXor:对两个数组进行按位异或操作;84、cvXorS:在数组和标量之间进行按位异或操作;85、cvZero:将所有数组中的元素置为0;86、cvConvertScaleAbs:计算可选的缩放值的绝对值之后再转换数组元素的类型;87、cvNorm:计算数组的绝对范数,绝对差分范数或者相对差分范数;88、cvAnd:对两个数组进行按位与操作;89、cvAndS:在数组和标量之间进行按位与操作;90、cvScale:是cvConvertScale的一个宏,可以用来重新调整数组的内容,并且可以将参数从一种数据类型转换为另一种;91、cvT:是函数cvTranspose的缩写;92、cvLine:画直线;93、cvRectangle:画矩形;94、cvCircle:画圆;95、cvEllipse:画椭圆;96、cvEllipseBox:使用外接矩形描述椭圆;97、cvFillPoly、cvFillConvexPoly、cvPolyLine:画多边形;98、cvPutText:在图像上输出一些文本;99、cvInitFont:采用一组参数配置一些用于屏幕输出的基本个特定字体;100、cvSave:矩阵保存;101、cvLoad:矩阵读取;102、cvOpenFileStorage:为读/写打开存储文件;103、cvReleaseFileStorage:释放存储的数据;104、cvStartWriteStruct:开始写入新的数据结构;105、cvEndWriteStruct:结束写入数据结构;106、cvWriteInt:写入整数型;107、cvWriteReal:写入浮点型;108、cvWriteString:写入字符型;109、cvWriteComment:写一个XML或YAML的注释字串;110、cvWrite:写一个对象;111、cvWriteRawData:写入多个数值;112、cvWriteFileNode:将文件节点写入另一个文件存储器;113、cvGetRootFileNode:获取存储器最顶层的节点;114、cvGetFileNodeByName:在映图或存储器中找到相应节点;115、cvGetHashedKey:为名称返回一个惟一的指针;116、cvGetFileNode:在映图或文件存储器中找到节点;117、cvGetFileNodeName:返回文件的节点名;118、cvReadInt:读取一个无名称的整数型;119、cvReadIntByName:读取一个有名称的整数型;120、cvReadReal:读取一个无名称的浮点型;121、cvReadRealByName:读取一个有名称的浮点型;122、cvReadString:从文件节点中寻找字符串;123、cvReadStringByName:找到一个有名称的文件节点并返回它;124、cvRead:将对象解码并返回它的指针;125、cvReadByName:找到对象并解码;126、cvReadRawData:读取多个数值;127、cvStartReadRawData:初始化文件节点序列的读取;128、cvReadRawDataSlice:读取文件节点的内容;129、cvGetModuleInfo:检查IPP库是否已经正常安装并且检验运行是否正常;130、cvResizeWindow:用来调整窗口的大小;131、cvSaveImage:保存图像;132、cvMoveWindow:将窗口移动到其左上角为x,y的位置;133、cvDestroyAllWindow:用来关闭所有窗口并释放窗口相关的内存空间;134、cvGetTrackbarPos:读取滑动条的值;135、cvSetTrackbarPos:设置滑动条的值;136、cvGrabFrame:用于快速将视频帧读入内存;137、cvRetrieveFrame:对读入帧做所有必须的处理;138、cvConvertImage:用于在常用的不同图像格式之间转换;139、cvErode:形态腐蚀;140、cvDilate:形态学膨胀;141、cvMorphologyEx:更通用的形态学函数;142、cvFloodFill:漫水填充算法,用来进一步控制哪些区域将被填充颜色;143、cvResize:放大或缩小图像;144、cvPyrUp:图像金字塔,将现有的图像在每个维度上都放大两倍;145、cvPyrSegmentation:利用金字塔实现图像分割;146、cvThreshold:图像阈值化;147、cvAcc:可以将8位整数类型图像累加为浮点图像;148、cvAdaptiveThreshold:图像自适应阈值;149、cvFilter2D:图像卷积;150、cvCopyMakeBorder:将特定的图像轻微变大,然后以各种方式自动填充图像边界;151、cvSobel:图像边缘检测,Sobel算子;152、cvLaplace:拉普拉斯变换、图像边缘检测;153、cvHoughLines2:霍夫直线变换;154、cvHoughCircles:霍夫圆变换;155、cvRemap:图像重映射,校正标定图像,图像插值;156、cvWarpAffine:稠密仿射变换;157、cvGetQuadrangleSubPix:仿射变换;158、cvGetAffineTransform:仿射映射矩阵的计算;159、cvCloneImage:将整个IplImage结构复制到新的IplImage中;160、cv2DRotationMatrix:仿射映射矩阵的计算;161、cvTransform:稀疏仿射变换;162、cvWarpPerspective:密集透视变换(单应性);163、cvGetPerspectiveTransform:计算透视映射矩阵;164、cvPerspectiveTransform:稀疏透视变换;165、cvCartToPolar:将数值从笛卡尔空间到极坐标(极性空间)进行映射;166、cvPolarToCart:将数值从极性空间到笛卡尔空间进行映射;167、cvLogPolar:对数极坐标变换;168、cvDFT:离散傅里叶变换;169、cvMulSpectrums:频谱乘法;170、cvDCT:离散余弦变换;171、cvIntegral:计算积分图像;172、cvDistTransform:图像的距离变换;173、cvEqualizeHist:直方图均衡化;174、cvCreateHist:创建一新直方图;175、cvMakeHistHeaderForArray:根据已给出的数据创建直方图;176、cvNormalizeHist:归一化直方图;177、cvThreshHist:直方图阈值函数;178、cvCalcHist:从图像中自动计算直方图;179、cvCompareHist:用于对比两个直方图的相似度;180、cvCalcEMD2:陆地移动距离(EMD)算法;181、cvCalcBackProject:反向投影;182、cvCalcBackProjectPatch:图块的方向投影;183、cvMatchTemplate:模板匹配;184、cvCreateMemStorage:用于创建一个内存存储器;185、cvCreateSeq:创建序列;186、cvSeqInvert:将序列进行逆序操作;187、cvCvtSeqToArray:复制序列的全部或部分到一个连续内存数组中;188、cvFindContours:从二值图像中寻找轮廓;189、cvDrawContours:绘制轮廓;190、cvApproxPoly:使用多边形逼近一个轮廓;191、cvContourPerimeter:轮廓长度;192、cvContoursMoments:计算轮廓矩;193、cvMoments:计算Hu不变矩;194、cvMatchShapes:使用矩进行匹配;195、cvInitLineIterator:对任意直线上的像素进行采样;196、cvSampleLine:对直线采样;197、cvAbsDiff:帧差;198、cvWatershed:分水岭算法;199、cvInpaint:修补图像;200、cvGoodFeaturesToTrack:寻找角点;201、cvFindCornerSubPix:用于发现亚像素精度的角点位置;202、cvCalcOpticalFlowLK:实现非金字塔的Lucas-Kanade稠密光流算法;203、cvMeanShift:mean-shift跟踪算法;204、cvCamShift:camshift跟踪算法;205、cvCreateKalman:创建Kalman滤波器;206、cvCreateConDensation:创建condensation滤波器;207、cvConvertPointsHomogenious:对齐次坐标进行转换;208、cvFindChessboardCorners:定位棋盘角点;209、cvFindHomography:计算单应性矩阵;210、cvRodrigues2:罗德里格斯变换;211、cvFitLine:直线拟合算法;212、cvCalcCovarMatrix:计算协方差矩阵;213、cvInvert:计算协方差矩阵的逆矩阵;214、cvMahalanobis:计算Mahalanobis距离;215、cvKMeans2:K均值;216、cvCloneMat:根据一个已有的矩阵创建一个新矩阵;217、cvPreCornerDetect:计算用于角点检测的特征图;218、cvGetImage:CvMat图像数据格式转换成IplImage图像数据格式;219、cvMatMul:两矩阵相乘;。
opencv常用函数
opencv常用函数OpenCV是一款开源的计算机视觉库,其中提供了许多常用的函数,可以用于图像处理,机器视觉等领域。
下面就介绍一些OpenCV中常用的函数:1.cv::Mat函数:它是OpenCV中最常用的函数,用于表示图像的像素信息。
它是一种多维数组,可以用来存放像素值。
2.cv::imread函数:它用于读取图像文件,并将其转换成cv::Mat格式的对象。
3.cv::imshow函数:它用于将读取的图像显示出来,以便可以查看其内容。
4.cv::cvtColor函数:它用于将图像从一种颜色空间转换到另一种颜色空间,例如从灰度图像转换为彩色图像。
5.cv::GaussianBlur函数:它用于对图像进行高斯模糊处理,可以有效地去除噪声,平滑图像。
6.cv::Sobel函数:它用于实现Sobel算子,用于检测图像中的边缘。
7.cv::threshold函数:它用于将图像中的像素值转换为二值图像,以便更容易识别图像中的物体。
8.cv::findContours函数:它用于在二值图像中查找轮廓,可以用于物体检测和跟踪。
9.cv::HoughLines函数:它用于检测图像中的直线,可以用于检测图像中的线条。
10.cv::calcHist函数:它用于计算图像的直方图,以便可以更好地了解图像的特征。
11.cv::kmeans函数:它用于对图像进行聚类,可以将图像分割成不同的区域,以便进行进一步的处理。
12.cv::rectangle函数:它用于在图像中画出矩形,可以用于标注图像中的物体,或者实现图像裁剪。
以上就是OpenCV中常用的一些函数,它们可以帮助我们快速实现一些复杂的图像处理任务。
opencv copyto函数
opencv copyto函数
OpenCV的CopyTo函数是一个有用的OpenCV函数,可以将源数组复制到另一个数组中。
它可以复制单个元素或者那些可以使用 cvMat复
制的数组。
下面是该函数的定义和简要概述:
一、CopyTo函数定义:
void cvCopyTo( const CvArr* src, CvArr* dst, const CvArr* mask=NULL );
二、CopyTo函数简要概述:
1、src:指向源数组的指针;
2、dst:指向目的数组的指针;
3、mask:可选参数,用于指定要复制的元素;
三、CopyTo函数的特性:
1、CopyTo函数支持复制单个元素和数组;
2、它可以复制任何类型的数组,只要它们符合 OpenCV 的数据格式;
3、它还可以复制多维数组;
4、它支持具有填充(padding)元素的数组;
5、它支持 ROI(Region Of Interest)区域复制,这意味着只会复制ROI 区域内的元素;
6、它可以接受一个可选的掩码参数,以指定要复制的元素;
7、它复制的源和目的数组可以是不同的数组;
8、它将源数组中的所有内容复制到目的数组中,即使是未初始化的元素也能复制。
opencv 画点函数
opencv 画点函数OpenCV提供了两个函数来绘制点:1. `cv::Point()`:用于表示一个点的类。
2. `cv::circle()`:用于在图像上绘制一个圆。
以下是一个简单的例子,演示了如何在OpenCV中绘制点:```c++。
#include <opencv2/opencv.hpp>。
#include <iostream>。
int main() 。
//创建一个黑色的图像。
cv::Mat image(500, 500, CV_8UC3, cv::Scalar(0, 0, 0));。
//在图像上绘制一个蓝色的点。
cv::Point point(250, 250);。
cv::circle(image, point, 5, cv::Scalar(255, 0, 0), -1);。
//显示图像。
cv::imshow("Image", image);。
cv::waitKey(0);。
return 0;。
}。
```。
在这个例子中,我们使用了`cv::Mat()`函数创建了一个大小为500x500的空白图像,并将其填充为黑色。
我们使用了`cv::Point()`函数创建了一个点,并把它传递给了`cv::circle()`函数。
`cv::circle()`函数用于在图像上绘制圆形,我们使用它来画点。
最后,我们使用`cv::imshow()`函数显示图像,直到按下任意键为止。
输出图像如下所示:注意:`cv::circle()`的参数`radius`表示圆形的半径,`thickness`表示圆形的线宽,`-1`表示用填充颜色填充圆形。
opencv翻转函数
opencv翻转函数在OpenCV中,有3种不同的翻转函数:cv::flip()、cv::transpose()和cv::rotate()。
它们分别用于沿水平/垂直/对角线轴翻转矩阵、转置矩阵和旋转矩阵。
1. cv::flip()函数:。
该函数有3个参数:source(要翻转的矩阵)、dst(输出矩阵)和flipCode(用于指定要执行的操作)。
flipCode参数有3种不同的值:。
- flipCode = 0:沿x轴(垂直翻转)。
- flipCode > 0:沿y轴(水平翻转)。
- flipCode < 0:沿x轴和y轴(垂直和水平翻转)。
以下是一个使用cv::flip()翻转图像的示例:。
```。
cv::Mat src = cv::imread("input.jpg");。
cv::Mat dst;。
cv::flip(src, dst, 0); // 垂直翻转。
cv::imshow("Output", dst);。
cv::waitKey();。
```。
2. cv::transpose()函数:。
该函数用于矩阵转置,即交换行和列。
该函数只有1个参数:source (要转置的矩阵)。
以下是一个使用cv::transpose()转置矩阵的示例:。
```。
cv::Mat src = cv::Mat::eye(3, 3, CV_32FC1); // 生成一个3x3的单位矩阵。
cv::Mat dst;。
cv::transpose(src, dst); // 转置。
std::cout << src << std::endl << std::endl << dst << std::endl; // 输出源矩阵和目标矩阵。
```。
3. cv::rotate()函数:。
该函数用于对矩阵进行旋转。
它有4个参数:source(要旋转的矩阵)、dst(输出矩阵)、rotateCode(用于指定旋转方向)和rotateAngle(用于指定旋转角度)。
opencv的remap函数
opencv的remap函数OpenCV是一个广泛使用的计算机视觉库,其中的remap函数是其重要的功能之一。
remap函数用于图像的重映射,即根据指定的映射关系将图像中的像素从一个位置映射到另一个位置。
这种操作通常用于图像的几何变换,例如图像的旋转、缩放、平移等。
remap函数的原型如下:```pythondst = cv2.remap(src, mapx, mapy, interpolation[, dst[, borderMode[, borderValue]]])```其中,参数说明如下:- src:输入图像,可以是单通道或多通道的图像。
- mapx:x坐标的映射数组,每个像素对应的x坐标位置。
- mapy:y坐标的映射数组,每个像素对应的y坐标位置。
- interpolation:插值方法,用于确定重映射过程中像素的取值方式。
- dst:可选参数,输出图像,与输入图像具有相同的尺寸和类型。
- borderMode:可选参数,边界模式,用于处理重映射后超出图像边界的像素。
- borderValue:可选参数,边界像素的值,当边界模式为常量边界时使用。
remap函数的操作过程是通过遍历输入图像的每个像素,根据mapx 和mapy中对应的映射关系,将该像素重映射到目标图像中的对应位置。
插值方法用于在映射过程中确定像素的取值方式,常用的插值方法有最近邻插值、双线性插值、双三次插值等。
通过remap函数,可以实现多种几何变换效果。
例如,如果mapx和mapy数组分别是一系列旋转后的坐标,那么就可以使用remap函数将输入图像进行旋转。
同样地,可以使用不同的mapx和mapy数组实现图像的缩放、平移等效果。
除了几何变换,remap函数还可以用于校正图像畸变。
对于相机镜头引起的畸变问题,可以通过计算畸变矫正映射表,然后使用remap函数对图像进行矫正,以获得更精确的图像结果。
综上所述,OpenCV中的remap函数是一个强大的图像处理工具,通过指定映射关系,可以实现图像的旋转、缩放、平移等几何变换操作,同时也可以用于图像畸变校正。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);。