CV图像视觉算法
文章平均质量分 76
米天
图像处理,机器视觉,计算机视觉,深度学习
展开
-
Cityscapes数据集的深度完整解析
cityscapes数据集是分割模型训练时比较常用的一个数据集,他还可以用来训练GAN网络生成街景图片。数据集下载和文件夹组成:- 整个数据集包含50个欧洲城市,5000张精细标注图像(标注位于gtFine文件夹,2975张train(就是这部分图像用来训练),500张val,1525张test,19个分类类别),以及20000张非精细标注图像(标注位于gtCoarse文件夹),源图大小都是1024x2048(hxw)- 数据集下载一般有2-3个包,分别对应2-3个文件夹,即如下:- le原创 2021-03-30 17:59:18 · 16060 阅读 · 9 评论 -
OpenCV的加速
OpenCV基于OpenCL进行加速在opencv2.x版本中,ocl作为一个专门的模块,里边重新构建了一系列可以加速的算子,包括:feature2d。调用方法是基于宏指令#ifdef HAVE_OPENCL来查看是否调用ocl中对应的算法分支,这种方法不是特别方便,造成了用户代码冗余。在opencv3.x以后的版本中,ocl模块进行了重构,无需专门调用ocl模块中的算法,也无需定义HAVE_OPENCL,而只需要把mat输入改成Umat,即可自动内底层使用opencl的优化,而在opencv源码中看原创 2021-03-26 15:30:59 · 3239 阅读 · 0 评论 -
如何在Mat上绘制图形
绘制直线cv::line(Mat src,Point p1, Point p2, scalar color, int thickness=1,int linetype=8)绘制文字- cv::putText(Mat img, string text, Point lt, int fontface, double scale, Scalar color, int thick, int linetype, bool bottomLeftOrigin=false)注意:绘制文字时,默认以左上点为.原创 2021-03-23 16:08:31 · 633 阅读 · 0 评论 -
如何遍历Mat
由于Mat是类,必须用方法函数访问,不能用切片方法。采用mat.at<type>(row, col)进行访问,获得的是一个位置的深度指针:其中:如果是灰度图则type=uchar;如果是彩色图则type=Vec3b(包含了3个uchar);如果是浮点mat则type=Vec3f;如果是int8(short)则type=Vec3s;如果是int32则type=Vec3i;如果是double则type=Vec3d其中:如果是灰度图获得的是元素,如果是彩色图获得的是rgb数组实例:用a原创 2021-03-23 14:17:24 · 971 阅读 · 0 评论 -
如何构建高维Mat
如何理解opencv中Mat格式的空间结构空间nd数组与实际内存1d存放空间之间的对应关系参考了:https://oneapi-src.github.io/oneDNN/understanding_memory_formats.html- 如果是nchw这种数据如同左图图所示,为了获得某个位置的值,有对应的内存1d位置公式value_1d = n*CHW + c*HW + h*W + w,这个公式本质上的含义是:对于nchw结构的nd数据在存放到1d内存中时,切换顺序正相反维whcn,也就是先沿w.原创 2021-03-18 10:50:16 · 310 阅读 · 0 评论 -
如何构建平面Mat
基于尺寸构建Mat// 1. 基于rows, cols, typeMat img = Mat(src.rows, src.cols, CV_8UC1);// 2. 基于Size(cols, rows), type,注意size的顺序是列/行,不是行/列Mat img = Mat(Size(src.cols, src.rows), CV_8UC1);基于一个Rect构建新mat的思路方式1:用rect挖出一个matcv::Mat roi(src, cv::Rect(x,.原创 2021-03-17 10:34:26 · 132 阅读 · 0 评论 -
如何计算卷积层的尺寸、参数量和浮点操作数(FLOPs)
1. 卷积的计算过程- 输入特征图(Hi,Wi,Ci),采用卷积核(K,K,Ci, p, s),其中K为卷积核大小,Ci既是输入特征的通道数(深度)也是卷积核的通道数(深度),也就是说卷积核的通道数要跟特征图的通道数匹配才能进行每一次卷积,单通道灰度图对应单通道卷积核,三通道彩色图对应三通道卷积核。- 输出特征图(Ho,Wo,Co)中Co的计算方式:Co可以随便定义,但每一层输出特征图对应一个独立的卷积核进行一轮独立的卷积操作即Co个数一方面决定了输出特征图的通道数,另一方面也决定了卷积核.原创 2021-03-13 11:42:05 · 1523 阅读 · 0 评论 -
OpenCV数据结构源码
1. InputArrayInputArray就是OpenCV的一个万能接口类型,通常用于作为函数形参,从而可以让用户实参输入Mat, vector<T>, vector<vector<T>>等类型。InputArray的定义在mat.hpp(位于core/mat.hpp),而实现位于mat.inl.hpp(位于core/mat.inl.hpp)- 如果形参类型是InputArray,但可以传入Mat,是因为Mat是继承InputArray的子类- 传入的ma原创 2021-03-12 16:15:42 · 414 阅读 · 0 评论 -
如何在函数内部声明动态内存(堆区内存)并通过形参指针返回
在某些场合下,可能需要在函数内部申请动态堆区内存然后返回,比如某变量的值在函数内部计算是变化大小的,需要根据该值大小动态申请内存。这里存在一个很容易搞错的地方:由于编译器默认会对函数的形参变量进行拷贝得到一个临时拷贝变量,该拷贝变量跟原有形参变量的值相等,因此如果形参是指针,则该拷贝指针跟原形参指针指向同一个地址,修改该拷贝指针指向的值也就等价于修改原形参指针指向的地址,而等到函数运行完后,该拷贝变量就会被自动释放。- 错误的方式是传入一级指针如上图1所示:传入的是一个形参指针p,第1步生.原创 2021-03-10 13:44:09 · 1045 阅读 · 0 评论 -
Numpy中的concatenate, stack, tile的区别以及axis的本质理解
本篇详细解析了np.concatenate(), np.stack(), np.tile()的区别,以及axis的本质多个array堆叠采用np.concatenate([arr1,arr2…], axis=k)其中输入的array采用最简单的list容器放置即可其中axis代表维度方向,默认的axis维度是跟shape的维度(r, c)顺序一致的,也就是说axis=0代表的是第0个维度也就是row方向,axis=1代表的是第1个维度也就是col方向,更高维的情况也类似,只需要基于shape的结果进原创 2021-03-10 09:53:56 · 563 阅读 · 0 评论 -
如何查看和移植OpenCV源码
如何查看OpenCV源码在OpenCV的安装文件夹中,找到D:\opencv-4.2.0\modules文件夹,里边就按照modules的功能分成多个子文件夹,每个子文件夹中的src目录下就存放了源码cpp文件,也包括hpp文件。 实例:找到FAST特征提取算法源码 从modules\features2d\src文件夹中,可以找到该算法的头文件和cpp文件如下 2. 正确的查看opencv源码的方式:用vs...原创 2021-03-09 14:42:17 · 3635 阅读 · 3 评论