学习OpenCV
OpenCV4 项目实践 源码分析 经验总结
三石目
略知一二机器视觉
展开
-
OpenCV以指定点为起点指定角度,垂直向上为零度,顺时针增加,画一条覆盖图像的线
OpenCV以指定点为起点指定角度,垂直向上为零度,顺时针增加,画一条覆盖图像的线。原创 2024-01-23 11:48:14 · 337 阅读 · 0 评论 -
C++下通过变参(参数个数不确定)封装opencv的图像滤波
C++下通过变参(参数个数不确定)封装opencv的个图像滤波原创 2023-02-14 11:53:02 · 123 阅读 · 0 评论 -
向量积在图像中的常用场景
叉积(向量积)定义:1、a×b或a∧b,结果为标量;2、向量积|c|=|a×b|=|a||b|sin<a,b>,即c的长度在数值上等于以a,b,夹角为θ组成的平行四边形的面积;3、a=(x1,y1),b=(x2,y2),则a×b=x1y2-y1x2;4、a×b小于0,向量a小于180°逆时针旋转到向量b;a×b大于0,向量a小于180°顺时针旋转到向量b;a×b等于0,向量a平行与向量b;引用场景1:OpenCV中contourArea轮廓面积算法时,假设轮廓点(A、B、C)按顺时针原创 2022-01-12 11:48:50 · 2478 阅读 · 2 评论 -
c++下通过onnx部署yolov5-6.0到OpenCV
这里对比时使用的是自己整理的数据集,对瓶子进行目标检测,训练样本100张左右,测试样本20张左右,最终结果仅供参考。一、OpenCV实现过程参考链接:https://blog.csdn.net/qq_34124780/article/details/121079317注意事项:1、在6.0下可以不需要改动模型代码,包括大家提到的切片问题,只需要修改ONNX的参数opset默认13改为12,不然读取模型时会报错,应该是OpenCV还没有支持ONNX13;2、使用作者的代码跑自己的数据集时需要修改y原创 2021-11-18 23:07:21 · 4926 阅读 · 0 评论 -
学习OpenCV:使用reduce
求行或列的平均值、和、最大值、最小值。第三个参数为维度数,二维图像中等于0为列,等于1为行。 Mat srcMat = (cv::Mat_<uchar >(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9); vector<int> vecOutput; reduce(srcMat, vecOutput, 0, REDUCE_SUM); Mat matOutput; reduce(srcMat, matOutput, 0.原创 2021-03-17 15:37:01 · 484 阅读 · 0 评论 -
学习OpenCV:一些小技巧
1、imreadmulti可以直接获取文件夹中的多张图;2、imshow后选中窗口,Ctrl+C复制,Ctrl+S可保存,避免用imwrite.原创 2021-01-07 23:13:02 · 221 阅读 · 1 评论 -
学习OpenCV:rotatedRectangleIntersection计算两个旋转矩形的交集面积
如图所示,计算两个旋转矩形相交重合区域的顶点,最多返回8个顶点。通过contourArea可返回该顶点集合的面积。void DrawRotatedRect(Mat& imgInoutput, RotatedRect rectInput, Scalar color, int thickness, int lineType){ Point2f* vertices = new cv::Point2f[4]; rectInput.points(vertices); for (int j .原创 2020-12-16 17:25:30 · 4964 阅读 · 0 评论 -
各数据类型转换汇总(亲测)包括MFC、OpenCV、Halcon等
持续更新。。。1、CString转Const Char*CString strTemp=_T("测试");Const Char* charTemp=CT2A(strTemp);2、CString与string转换/*方法1*/USES_CONVERSION;CString CStrFileName = dlgFile.GetPathName();std::string ...原创 2019-02-14 16:30:15 · 776 阅读 · 0 评论 -
学习OpenCV:使用buildPyramid金字塔时的亚像素问题
在实现灰度匹配的过程中,从同一张目标图下截取部分作为模板,无法得到一个得分率约等于1的得分。这里采用了buildPyramid分别得到模板图与目标图的金字塔图,如下图所示,同一位置像素值相差较大。 ...原创 2020-11-17 16:41:05 · 484 阅读 · 0 评论 -
Halcon算子:灰度共生矩阵gen_cooc_matrix、cooc_feature_matrix、cooc_feature_image
1、灰度共生矩阵 图像的纹理一般具有重复性,纹理单元往往会以一定的规律出现的图像上,因此这种图像中一定距离之内往往会有两两灰度相同的像素点对,这种特性就适合用灰度共生矩阵表示。 取图像(N×N)中任意一点 (x,y)及偏离它的另一点 (x+a,y+b),设该点对的灰度值为(g1,g2)。令点(x,y) 在整个画面上移动,则会得到各种 (g1,g2)值,设灰度...原创 2020-02-27 16:26:30 · 3113 阅读 · 0 评论 -
学习OpenCV:频域及傅里叶变换
关键公式,《数字图像处理》第三版,P147:1、频谱图具有周期性,归一化为图像大小;2、频谱图具有对称性,以复数形式表示图像二维,幅值为实部与虚部平方和;https://www.zhihu.com/question/67234546/answer/403292397示例一:参考HDevelop中的remove_texture_fft.hdev,采用OpenCV实现去除图像中固定纹理;这里只是演示,只去除了部分纹理频率,没有完全去除干净,效果肯定没有HDevelop中的好:Mat C原创 2020-10-19 17:31:13 · 781 阅读 · 0 评论 -
学习OpenCV:hu矩
hu矩为描述整体图像特征的一种方法,零阶矩表示它的总质量;一阶矩表示它的质心;二阶矩又叫惯性矩,表示图像的大小和方向。通过计算普通矩可以知道图像的重心坐标、形状方向等; Mat imgSrc = imread("lena.jpg", IMREAD_GRAYSCALE); threshold(imgSrc, imgSrc, 50, 255, THRESH_BINARY); Moments mom = moments(imgSrc, false);// Calculate Moments dou原创 2020-09-27 23:52:45 · 1067 阅读 · 0 评论 -
学习OpenCV:海森矩阵(Hessian Matrix)
https://blog.csdn.net/u013921430/article/details/79770458https://www.cnblogs.com/jsxyhelu/p/12114981.html疑问与说明:1、得到特征值后怎么根据特征值判断为线性结构、角点结构?2、sigma跟模板大小怎么确定?3、描述子实际上为二维矩阵上的特征向量与特征值;...原创 2020-09-27 17:57:59 · 1315 阅读 · 0 评论 -
学习OpenCV:骨架提取
https://blog.csdn.net/FunnyWhiteCat/article/details/80670332转载 2020-09-26 12:19:25 · 1524 阅读 · 0 评论 -
学习OpenCV:minAreaRect与RotatedRect
minAreaRect:返回指定点集的带方向的最小外接矩形,数据类型为RotatedRect,其中返回的角度θ范围为(-90°,0°]。如果需要将θ限制在(-45°,45°],如:获取到角度-80°时,后面流程我需要的是顺时针旋转10°,如果直接使用是逆时针旋转80°,可参考以下实现,使输出为10°。其中逆时针旋转角度为负,顺时针旋转角度为正。 RotatedRect rect = minAreaRect(conMinArea); float fAngle = rect.angle;//θ∈原创 2020-09-08 18:00:53 · 651 阅读 · 0 评论 -
学习OpenCV:PCA
Principal Component Analysis,主成分分析。协方差:通过协方差的数值大小,可以判断这两个变量同向或反向的程度;相关系数:协方差除以标准差;https://www.zhihu.com/question/20852004总结一下PCA的算法步骤:设有m条n维数据。1)将原始数据按列组成n行m列矩阵X2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值3)求出协方差矩阵C=1mXXTC=1mXXT4)求出协方差矩阵的特征值及对应的特征向原创 2020-08-28 17:49:00 · 267 阅读 · 0 评论 -
C++序列化工程文件时的相关知识点
1、文件的写入与读取; ifstream input("test.svl", ios::in | ios::binary); int nLength; string strTemp; input.read((char*)&nLength, sizeof(int)); strTemp.resize(nLength); input.read((char*)&strTemp[0], nLength); std::cout << strTemp; ofstream原创 2020-08-27 17:28:30 · 216 阅读 · 0 评论 -
学习OpenCV:聚类函数partition的使用
vector<Point> vecPointsInput; vecPointsInput.push_back(Point(0, 0)); vecPointsInput.push_back(Point(0, 2)); vecPointsInput.push_back(Point(0, 5)); vecPointsInput.push_back(Point(0, 10)); vecPointsInput.push_back(Point(0, 20)); vecPointsInp...原创 2020-07-23 12:04:59 · 766 阅读 · 0 评论 -
学习OpenCV:对Canny的理解
CV_EXPORTS_W void Canny( InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false );threshold1:像素值小于低阈值,则排除为边缘像素,设置时参考同一个区域内(边缘区域内)像素值波动值情况,...原创 2020-07-22 18:30:32 · 346 阅读 · 0 评论 -
OpenCV实现OTSU算法(大津法)
int GetThresholdOTSU(Mat imgInput){ int hist[256] = { 0 }; double pro_hist[256] = { 0.0 }; int row = imgInput.rows; int col = imgInput.cols; for (int i = 0; i < row; ++i) //统计每个灰度的数量 { for (int j = 0; j < col; ++j) { int temp = imgInpu.原创 2020-07-20 19:03:29 · 598 阅读 · 0 评论 -
学习OpenCV:matchTemplate模板匹配原理分析
自己的一些理解,仅供参考。模板匹配无法就是在目标图中找出与模板图最相似的坐标。通过整体图像的整体灰度值来判断就是灰度匹配;通过图像的边缘信息来判断就是灰度匹配;通过图像的角点等特征点来判断就是特征匹配。模板匹配中,最重要的就是定义两幅图像的相似度,根据相似度的最值即可在目标图中找到对应的坐标。定义两幅图片相似度需要根据图片的实际情况选择,OpenCV这里提供了包含以下方法,MATLAB中还提供了一些其他方法。差值平方和匹配 TM_SQDIFF标准化差值平方和匹配 TM_SQD.原创 2020-06-24 19:26:54 · 1690 阅读 · 0 评论 -
学习OpenCV:phaseCorrelate使用
相位相关法(phase correlate)用于检测两幅内容相同的图像之间的相对位移量。可用于对齐图像,不具备光照不变性。 Mat imgTem = imread("22imgTemp.jpg"); Mat imgSrc = imread("22imgTargetAlign.jpg"); cvtColor(imgTem, imgTem, COLOR_RGB2GRAY); cvtColor(imgSrc, imgSrc, COLOR_RGB2GRAY); Mat imgTem64f, imgS.原创 2020-05-27 18:36:15 · 3608 阅读 · 0 评论 -
学习OpenCV:convertScaleAbs函数
vector<float> uvec{ -1000, 0.5, 1000 }; Mat imgSrc{ uvec }; Mat imgDst; convertScaleAbs(imgSrc, imgDst,0.5,10);-1000,0.5,1000转换后的数据是255,10,255。输入图像乘以alpha加beta后取绝对值,如果大于255则等于255。可用于调整对比度与亮度。...原创 2020-05-20 11:44:25 · 2626 阅读 · 0 评论 -
学习OpenCV:imgproc模块分类
imgproc模块中的分类及对应行数,简单整理了一下,有需要的可方便定位查找。枚举定义,0-835GeneralizedHough,837-944,imgproc_hist,945-982:imgproc_subdiv2d,984-1246:imgproc_feature,1248-1328:imgproc_filter,1330-1749:imgproc_fea...原创 2020-03-06 20:21:44 · 256 阅读 · 0 评论 -
学习OpenCV4:OpenCV-4.2.0+TBB+CUDA编译
1、下载CUDA安装包,当前版本为10.2,保证安装好。2、下载TBB安装包,在release下找到tbb-2020.0-win.zip,解压后放到指定目录。3、重启电脑后,打开CMake,按照之前流程准备好相关路径与文件,使Configure无错误。4、勾选WITH_CUDA与WITH_TBB,并且使BUILD_CUDA_STUBS、BUILD_TBB不勾选,再次Configure。...原创 2020-01-18 13:36:31 · 1627 阅读 · 0 评论 -
学习OpenCV4:模块imgproc
1、imgproc_filter:2、imgproc_transform:3、imgproc_misc:4、imgproc_draw:5、imgproc_color_conversions:6、imgproc_colormap:7、imgproc_subdiv2d:8、imgproc_hist:9、imgproc_shape:10、imgproc_motion:...原创 2019-10-28 10:03:53 · 391 阅读 · 0 评论 -
学习OpenCV4:模块photo
1、图像修复:inpaint2、去噪:fastNlMeansDenoising、fastNlMeansDenoisingColored、fastNlMeansDenoisingMulti、denoise_TVL13、HDR:https://www.zcfy.cc/article/high-dynamic-range-imaging-using-opencv-cpp-python4、脱色...原创 2019-10-17 16:07:40 · 470 阅读 · 0 评论 -
学习OpenCV4:K-Means方法实现证件照背景替换
环境:OpenCV4.1.0+VS2017+MFC应用程序:https://download.csdn.net/download/stone_wang_mz/11165793源码:https://gitee.com/Stone_Wang/ReplaceBackground,环境自行配置说明:通过OpenCV中K-Means方法实现。...原创 2019-05-08 10:17:40 · 742 阅读 · 0 评论 -
OpenCV4探索学习:基础功能与技巧
(长期更新)1、Mat中数据传递、赋值,操作clone() 与copyto()的区别。Mat imageSrc = imread("1.png" , 0) ;Mat imageDst(imageSrc) ;//仅是创建了Mat的头部分,共享数据区Mat imageDst = imageSrc ;//仅是创建了Mat的头部分,共享数据区Mat imageDst = imageSrc.c...原创 2019-01-03 14:34:12 · 538 阅读 · 0 评论 -
OpenCV4探索学习:轮廓
轮廓提取:findContoursvoid findContours//提取轮廓,用于提取图像的轮廓( InputOutputArray image,//输入图像,必须是8位单通道图像,并且应该转化成二值的 OutputArrayOfArrays contours,//检测到的轮廓,每个轮廓被表示成一个point向量 OutputArray hierarchy,//可选的输出向量,包...原创 2019-08-19 10:46:42 · 577 阅读 · 0 评论 -
学习OpenCV:仿射变换与透视变换
1.仿射变换1) 用途旋转 (线性变换),平移 (向量加).缩放(线性变换),错切,反转2) 方法仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。任意的仿射变换都能表示为乘以一个矩阵(线性变换),再加上一个向量 (平移) ...转载 2019-08-06 12:43:11 · 251 阅读 · 0 评论 -
OpenCV4探索学习:OpenCV-4.1.0 编译运行文件(build)说明
编译好的OpenCV有两个文件夹,build和sources,这里我们介绍build。打开文件夹“..\ opencv-4.1.0\opencv\build”。Include:工程中需要用到的头文件,可以直接拷贝到工程目录中使用,通常使用环境变量,比较方便,且不容易出错。新建变量及值(路径),保存后重启电脑。Java:包含java运行需要的库文件,分32位、64位。P...原创 2019-07-02 16:00:26 · 2934 阅读 · 0 评论 -
OpenCV4探索学习:CommandLineParser类的使用说明
const char* keys ={ "{input |2.jpg| string |input image}" "{w|8|}{h|11|}" "{help||}"}; //分别表示:简称|文件来源|文件值|帮助语句,可缺省 int main(int argc, char** argv){ CommandLineParser parser(argc, argv, keys)...原创 2019-07-03 15:00:17 · 285 阅读 · 0 评论 -
OpenCV4探索学习:OpenCV-4.1.0 Samples官方示例说明
打开文件夹“...\ opencv-4.1.0\opencv\sources\samples”。可以发现包含各种语言的示例,这里针对cpp。在目录该目录下,我们发现CMakeLists.txt,可以用CMake工具生成Visual Studio解决方案。新建文件夹“opencv-4.1.0-sample”用于保存工程,这里选择编译器为vs2017 Win64。第一次Config...原创 2019-07-01 17:34:40 · 10316 阅读 · 5 评论 -
学习OpenCV4:OpenCV-4.1.0+VS2017 编译(包含扩展)
OpenCV 4.0 版本增加的新功能如下:1) 更新代码支持 c++11 特性,需要兼容 c++11 语法的编译器2)增加 dnn 中的模块功能,新加了 Vulkan API 程序接口3)集成了完整的 QR 码识别功能4) 新加的 opencv_gapi 模块5) 整体速度的提升6) 增加流行的 Kinect 融合算法7) DIS 稠密光流检测算法从 opencv_...原创 2019-07-01 12:18:07 · 1163 阅读 · 0 评论 -
学习OpenCV:RANSAC算法
步骤:1. 随机从数据集中随机抽出4个样本数据 (此4个样本之间不能共线),计算出变换矩阵H,记为模型M;2. 计算数据集中所有数据与模型M的投影误差,若误差小于阈值,加入内点集 I,第一次迭代等于I_best ;3. 如果当前内点集 I 元素个数大于最优内点集 I_best , 则更新 I_best = I,同时更新迭代次数k ;4. 如果迭代次数大于k,则退出 ; 否则迭代次数...原创 2019-08-31 11:12:08 · 1528 阅读 · 1 评论