CHAO_^
这个作者很懒,什么都没留下…
展开
-
一维峰值查找算法find_peaks
支持峰值最小间距过滤。原创 2023-05-06 23:37:34 · 423 阅读 · 0 评论 -
九点标定和手眼标定
1. /usr/lib/libiniparser.so: file not recognized: File format not recognized库文件的格式不对,需要删除该库文件,编译出对应平台的库文件,再进行make原创 2022-01-01 19:37:41 · 1625 阅读 · 0 评论 -
Opencv sift词袋模型
Bow模型BoW模型最早用于NLP和IR领域,该模型忽略掉文本的语法和语序,用一组无序的的单词(words)来表达一段文字。并利用word出现的次数构建直方图作为特征向量。Bow模型也可用于计算机视觉领域,图像的特征被当做word。应用于计算机视觉的Bow提取特征碎片以SIFT特征为例,SIFT特征是一种局部特征,对图像的扭曲,光照变化,视角变换,尺度旋转都具有不变性。SIFT算法提取图像的特征点,每张图像的特征点数,不是固定值,每一个特征点存在一个特征描述向量,维度为固原创 2021-08-23 22:53:57 · 409 阅读 · 0 评论 -
轮廓直角检测
int findRightAngle(int *x, int *y, int size){ double *angles = (double *)malloc(size * sizeof(double)); int gap = 10; //printf("contour size is --------------%d\n", size); for (int i = 0; i < size; i++) { int left = ((i - gap) + size) % siz.原创 2021-07-11 12:06:21 · 311 阅读 · 0 评论 -
三点计算夹角
double get_angle(double x1, double y1, double x2, double y2, double x3, double y3){ double theta = atan2(x1 - x3, y1 - y3) - atan2(x2 - x3, y2 - y3); if (theta > CV_PI) theta -= 2 * CV_PI; if (theta < -CV_PI) theta += 2 *...原创 2021-06-24 22:26:17 · 934 阅读 · 0 评论 -
Laplace图像增强
基于拉普拉斯算子的图像锐化使用二阶差分算子(也可以用一阶差分算子, 也就是梯度)提取图像边缘图像。将边缘图像加到源图像上,实现增强边缘的功能。laplacian核为chararith[9] = { 0, -1, 0, -1, 4, -1, 0, -1, 0 };如果用这个核卷积,得到是的边缘图像再加上原像素灰度,得到核。chararith[9] = { 0, -1, 0, -1, 5, -1, 0, -1, 0 };...原创 2021-06-18 16:14:22 · 509 阅读 · 0 评论 -
自适应图像对比度增强
参考halcon中的emphasize函数res := round((orig - mean) * Factor) + orig新的像素值res 等于 原始图像该点的像素值 减去 对内核大小范围内所有点的像素值的平均像素值,然后对这个结果近似取整(可以有负值),再把这个值加上原来这点的像素值,得到这个最终结果去替换原来这点的像素值。...原创 2021-06-18 08:52:08 · 313 阅读 · 0 评论 -
灰度空间分布
灰度直方图是为了描述灰度值在值域上的分布,为了描述灰度在空间上的分布,引入了灰度空间分布的概念。1. 空间量化使用网格法对空间进行量化。也可以根据具体情况对空间进行划分,划分为扇形空间或环形空间。2.求取每一个网格的均值,按照百分比进行分布,把分布差异进行放大std::vector<double> getGraySpatialDistribution(cv::Mat src, int w, int h){ int x_step = src.cols / w; int原创 2021-05-13 23:15:56 · 2492 阅读 · 0 评论 -
高斯线条提取算法
Halcon中的lines_gauss采用的是steger算法,Steger算法基于Hessian矩阵,能够实现线条中心亚像素精度定位。原理简述高斯模糊滤波; 粗定位线条位置,减少运算量; Hessian矩阵计算特征值检测线条法线方向; 定位线条的亚像素坐标;Hessian矩阵Hessian 矩阵特征值Hessian矩阵的特征值形容其在该点附近特征向量方向的凹凸性,特征值越大,凸性越强。对于二维图像的某点的hessian矩阵,其最大特征值和其对应的特征向量对应其邻域.原创 2021-02-26 14:04:22 · 1531 阅读 · 0 评论 -
快速傅里叶变换
多项式乘法理解傅里叶变换首先要从多项式乘法开始。多项式的系数表示和点值表示多项式的系数表示存在多项式则称式(2)为多项式(1)的系数表示法,系数表示法下多项式乘法的算法复杂度为O(n2)。多项式的点值表示任意一个n阶多项式函数可由n+1个点来确定。点值表示法下多项式乘法的算法复杂度为O(n)将”系数”表示法转化为“离散的点”称为离散傅里叶变换。...原创 2020-03-31 19:55:53 · 1289 阅读 · 1 评论 -
基于K-Means的图像分割
简述 K-means是无监督的聚类算法。其主要思想是选择K个点作为初始聚类中心, 将每个对象分配到距离最近的中心形成K个簇,重新计算每个簇的中心,重复以上迭代步骤,直到簇不再变化或达到指定迭代次数为止。让簇内的点尽量紧密的连接在一起,而让簇间的距离尽量的大。 K-means每次计算质心,第一次是随机产生质心,第二次开始,是根据第一次分类后,每类的平均值作为质心,所以叫K-me...原创 2020-11-02 15:25:37 · 3070 阅读 · 0 评论 -
MSER最大稳定极值区域
简述:Mser基于分水岭的概念,对图像进行二值化,二值化阈值取[0, 255],这样二值化图像就经历一个从全黑到全白的过程,在这个过程中,有些连通区域面积随阈值上升的变化很小,这种区域就叫做最大稳定极值区域。数学定义为:Qi表示阈值为i时的某一连通区域,△为灰度阈值的微小变化量,q(i)为阈值是i时的区域Qi的变化率。当q(i)为局部极小值时,则Qi为最大稳定极值区域。上述做法可以检测出图像的暗色区域,对图像进行灰度反转,重复上述过程,可以检测出图像的亮色区域。OPENC..原创 2020-09-11 19:28:34 · 970 阅读 · 0 评论 -
Harris角点检测
Moravec角点检测算子Maravec算法将角点定义为具有低“自相关性”。算法会检测图像的每一个像素,将像素周边的一个邻域作为一个窗口,并检测这个窗口和周围其他窗口的相关性。这种相关性通过两个窗口间的平方差之和(SSD)来衡量,SSD值越小则相似性越高。Moravec会计算每个像素窗口和周围窗口的SSD最小值作为强度值,取局部强度最大的点作为特征点。以3x3为例,黑色窗口为I(x,y) 红色窗口为I(x+u,y+v),其中四种移位(u,v)=(1,0), (1,1), (0,1),原创 2020-09-01 21:35:13 · 380 阅读 · 0 评论 -
opencv 非线性坐标映射
坐标映射传统的仿射变换是均匀拉伸,可以将目标拉伸到一定的尺寸,但图像不同位置的拉伸尺度却不相同,所以需要再次对图像做一次坐标映射。voidremap(InputArraysrc,OutputArraydst,InputArraymap1,InputArraymap2,intinterpolation,intborderMode=BORDER_CONSTANT,...原创 2020-08-27 23:02:34 · 480 阅读 · 0 评论 -
Java 中JNI调用Opencv : Bitmap和Mat相互转换
在使用Java调用Opencv函数时,无可避免地会使用到Bitmap和Mat的相互转换。依赖在CmakeList.txt中添加jingraphics依赖库Bitmap转Mat#define ASSERT(status, ret) if (!(status)) { return ret; }#define ASSERT_FALSE(status) ASSERT(status, false)bool BitmapToMat(JNIEnv *...原创 2020-08-15 21:38:45 · 1785 阅读 · 0 评论 -
圆度,矩形度
圆度计算(Circularity,Roundness)一种计算方式,该方法算出的圆度不够准确,不建议在精度要求较高的场合使用Roundness = (4 * CV_PI * Area) / (Perimeter* Perimeter)doublegetRoundness(std::vector<cv::Point>contour){doublefactor=(cv::contourArea(contour)*4*CV_PI)/(pow(cv...原创 2020-08-15 20:20:01 · 4079 阅读 · 0 评论 -
像素尺寸和打印尺寸
DPI(点每英寸)DPI是描述分辨率的单位,图像分辨率是单位英寸中所包含的像素点数。DPI是打印机,鼠标等设备分辨率的度量单位。打印机200dpi表示,每英寸上,能印刷200像素。英寸和毫米换算1 英寸=25.4 毫米1 毫米(mm)=0.0393700787402 英寸像素换算一张实际尺寸为200*20毫米的物体,需要按照一比一的尺寸进行打印,打印机的DPI为200,那么图像的物体在图像中的像素尺寸应该为多少?对于200dpi的打印机,1mm可以印刷...原创 2020-08-06 15:08:25 · 3716 阅读 · 0 评论 -
已知三点坐标,求三角形面积
double getTriangleArea(cv::Point pt_0, cv::Point pt_1, cv::Point pt_2){ double area; area = ((pt_1.x-pt_0.x)*(pt_2.y-pt_0.y)-(pt_2.x-pt_0.x)*(pt_1.y-pt_0.y)) / 2.0; area = abs(area); return area;}原创 2020-08-05 00:22:29 · 998 阅读 · 0 评论 -
标准化欧式距离
标准化欧式距离在对长方体区域进行聚类的时候,普通的距离无法满足要求。 按照普通的距离聚类出的大多是圆形的区域,这时候要采用标准的欧式距离。 两个 n 维向量 a(X11,X12,X13,…X1n)与b(X21,X22,…X2n) 间的标准化欧氏距离公式为: 其中SK是分量的标准差。对于长宽比为2:1的矩形进行聚类,使用标准欧式距离公式为:原创 2016-03-30 21:21:21 · 16114 阅读 · 0 评论 -
欧拉旋转坐标变换
A (x1 ,y1) 以 ( x0, y0) 为圆心旋转 n 度,求旋转后 A' (x' , y') 坐标值.x' = x0 + (x1 - x0) cosn - (y1 - y0)sinny' = y0 +(y1 - y0)cosn + (x1 - x0) sinn原创 2020-07-08 15:48:35 · 2613 阅读 · 0 评论 -
opencv 画旋转矩形
void drawRotatedRect(cv::RotatedRect rect, cv::Mat src){ cv::Point2f P[4]; rect.points(P); for (int j = 0; j <= 3; j++) { cv::line(src, P[j], P[(j + 1) % 4], cv::Scalar(0, 255, 0), 5); }}原创 2020-07-31 19:54:02 · 732 阅读 · 0 评论 -
opencv 获得旋转矩形ROI
cv::Mat src = cv::imread("E://1.bmp", 0); cv::Mat binary; cv::threshold(src, binary, 0, 255, CV_THRESH_OTSU | cv::THRESH_BINARY_INV); std::vector<std::vector<cv::Point>> contours; std::vector<cv::Vec4i> hierarchy; ...原创 2020-07-31 19:53:41 · 1321 阅读 · 0 评论 -
opencv透视变换
#include<opencv2/opencv.hpp>#include<iostream>using namespace std;using namespace cv;struct userdata { Mat im; vector<Point2f> points;};void mouseHandle(int event, int x, int y, int flags,void* ptr){ if (event == EV.原创 2020-08-05 00:22:05 · 164 阅读 · 0 评论 -
opencv 多边形拟合
函数CV_EXPORTS_W void approxPolyDP( InputArray curve,OutputArray approxCurve,double epsilon, bool closed );参数详解:InputArray curve:一般是由图像的轮廓点组成的点集;OutputArray approxCurve:表示输出的多边形点集;double epsilon:拟合的多边形到原轮廓的最大距离,根据经验如果要拟合四边形,则该值为contour.size() / .原创 2020-07-09 22:31:10 · 1960 阅读 · 3 评论 -
引导滤波
简述对于普通的滤波器而言,对待噪声和边缘信息采取一致的态度,噪声被消除的同时,边缘,纹理,和细节等信息也被减弱。引导滤波算法在进行滤波时需要一幅引导图像,引导图像可以是其他图像,也可以是输入图像本身,当引导图像为输入图像本身时,引导滤波器具备边缘保持的特征。在引导滤波的定义中,用到了局部线性模型,该模型认为,某函数上一点与其邻近部分的点成线性关系,一个复杂的函数可以用很多的局部线性函数表示。当需要求该函数上某一点的值时,只需计算所有包含该点的线性函数的值并做平均即可。算法原...原创 2020-07-05 11:37:02 · 770 阅读 · 0 评论 -
二值图像孔洞填充
二值图像孔洞填充原理将原图像向外延展一到两个像素,并将值填充为0。 使用floodFill函数将扩展后图像的大背景填充,填充值为前景色255,种子点为(0,0)即可(步骤一可以确保(0,0)点位于大背景。 将填充好的图像裁剪为原图像大小(去掉延展区域)。 将剪裁后的图像取反与原图像相加即得填充的图像。void fillHole(const Mat srcBw, Mat &dstBw){ Size m_Size = srcBw.size(); Mat Tem..原创 2020-06-07 12:23:42 · 1328 阅读 · 0 评论 -
Opencv&Halcon混合编程
前言Halcon 具备一些非常强大的算子,特别是其中的模板匹配功能,因此在建立自己的解决方案时,灵活的运用Halcon与OpenCV往往会事半功倍。1. 编写halcon代码以halcon中的find_scaled_shape_model为例。2. 导出halcon代码到C++删除掉被宏定义注释的代码,主要关注action函数里面的代码。删除窗口显示相关代码。3. 头文件和库文件添加头文件和库文件路径将DLL文件拷贝到可执行文件目录下4...原创 2020-05-23 17:30:44 · 2432 阅读 · 0 评论 -
区域灰度差变换
用一个矩形掩模计算像素点的灰度范围halcon例子:engraved.hdev原理:该像素点为中心,所在矩形的最大灰度和最小灰度差。voidgray_range_rect(cv::Mat&src, cv::Mat&dst, intwidth, intheight){inthalf_w = width/ 2;inthalf_h ...原创 2020-03-31 19:57:20 · 643 阅读 · 0 评论 -
动态阈值分割
halcon中的dyn_thresholdnen,参考例子,particle.hdev。对于一些目标较小,且与背景对比不明显的图像可以采用动态阈值分割。为了过滤大目标的干扰,可以使用一些方法(二值化,连通域分析),对大目标进行mask。步骤:使用均值滤波获得图像背景; 将原图与背景进行对比相减,位于一定阈值范围内的认为是目标。 形态学处理;voiddyn_thre...原创 2020-03-31 17:17:53 · 1723 阅读 · 0 评论 -
曲率尺度空间
曲率尺度空间技术因为性质优秀被MPEG-7选为形状描述的标准技术。曲率:曲线的曲率就是针对曲线上某个点的切线方向角对弧长的转动率,通过微分来定义,表明曲线偏移直线的程度,曲率越大,表示曲线的弯曲程度越大。曲线的参数方程为:曲率计算公式为:对曲线进行高斯卷积,为宽度为的高斯卷积核:卷积后的曲线方程为:CSS技术能够提取形...原创 2020-03-31 17:18:45 · 1430 阅读 · 0 评论 -
均值漂移算法
均值漂移聚类均值漂移聚类是基于滑动窗口的算法,它试图找到数据点的密集区域步骤:随机选择一个点为中心,求取该圆形区域内所有点到中心点的距离向量的平均值,计算该平均值得到一个偏移均值,然后将中心点移动到偏移均值位置,迭代上述过程,直至中心点逐渐逼近到最佳位置。相比与k-means聚类算法,不需要指定聚类的个数.均值漂移滤波利用聚类的思想,将颜色相近的区域归为一类...原创 2020-03-31 17:19:33 · 826 阅读 · 0 评论 -
分水岭分割算法
分水岭算法分水岭算法将图像看做3-D的地形模型,图像中每一像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为积水盆地,积水盆地的边界形成分水岭。每个局部极小值刺一个孔,将该地形模型缓慢浸入水中,随着浸入的加深,水会从局部极小值浸入并扩散至周围,直到两个积水盆地的水汇合,汇合的线就是分水岭。在真实图像中,由于噪声点或者其它干扰因素的存在,使用分水岭算法常常存在过度分割的现象...原创 2020-03-31 19:55:40 · 806 阅读 · 0 评论 -
双边滤波
简述双边滤波器了综合了高斯滤波器和α-截尾均值滤波器的特征,同时考虑了空间域和值域的差别,达到保边去噪声的目的。高斯滤波器使用二维高斯核,对像素临域进行加权平均。α-截尾均值滤波器考虑像素灰度值之间的差值,去掉α%的最小值和最大值后在计算均值。空域权重(Spatial Weight)空域权重衡量的是两点之间的距离,距离越远权重越低,在平坦区域...原创 2020-03-31 17:19:50 · 197 阅读 · 0 评论 -
基于形状的模板匹配
基于形状的模板匹配该算法的相似度量考虑的是模板内像素的梯度向量,并通过计算梯度向量的内积总和最小值确定最佳匹配位置,稳定性和可靠性都比较优越。步骤建立模板对模板图像进行一系列旋转,缩放,金字塔下采样,生成一系列模板。 对模板图像进行边缘提取 计算边缘的梯度方向 归一化梯度强度消除光照影响匹配模板生成图像的金字塔 从金字塔顶层开始,计算图像的边缘方向梯度 通过...原创 2020-03-31 17:19:04 · 2425 阅读 · 1 评论 -
opencv轮廓检测
vector<vector<cv::Point>> contours;vector<cv::Vec4i> hierarchy;cv::findContours(src, contours, hierarchy, CV_RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);cv::Mat conto...原创 2020-03-31 19:54:43 · 387 阅读 · 0 评论 -
Hu矩
void C_HuMoments::getHuMoments(IplImage * img, double * Hu, uchar thresh, uchar density){ if (NULL == Hu) return; double m_00 = 0, m_10 = 0, m_01 = 0; double u_11 = 0, u_20 = ...原创 2020-03-31 19:54:59 · 170 阅读 · 0 评论 -
形状上下文
形状上下文1. 边缘采样获取对象形状的n个边缘点,可以采用canny提取边缘然后等间隔采样的方式。2. 计算上下文以每一个点为中心画一个n层的同心圆,等角度分为m个扇形,得到mn个区域。计算每个点在这mn个区域出现的统计直方图,该直方图用于表示其他点在当前点周围分布的情况。3. 计算代价矩阵其中hiK为目标p的点pi的形状直方图,为目标q的点qj的形状直方图。最终得到一个n*n的代...原创 2020-03-31 19:53:16 · 1370 阅读 · 0 评论 -
灰度共生矩阵
简述由于纹理是有灰度分布在空间位置上反复出现而形成的,因而在图像空间中相隔某距离的两像素之间会存在一定的灰度关系,即图像中灰度的空间相关特性。灰度共生矩阵就是一种通过研究灰度的空间相关特性来描述纹理的常用方法。计算灰度共生矩阵(GLCM)GLCM为图像I的灰度共生矩阵,它是通过统计灰度i与灰度j在图像I中的相邻次数而得到的,记为GLCM(i,j)。函数glcms = gra...原创 2020-03-31 19:50:03 · 1014 阅读 · 0 评论 -
图像拼接
图像拼接算法一般基于如下思路:对每张图像进行特征点提取; 特征点匹配; 特征点筛选 计算投影矩阵; 进行投影变换 进行图像简单拼接; 对重叠部分进行融合;特征点提取选择不同的特征点提取算法,会对拼接的结果产生影响。分别测试了sift,surf,orb对特征点进行提取,在其他步骤一样的情况下,最终的拼接效果sift≈surf>orb特征点匹配特征点筛选排序...原创 2020-03-31 19:55:14 · 919 阅读 · 0 评论 -
边缘跟踪算法
该算法来源于论文《二值图像中目标物体轮廓的边界跟踪算法》,在实际使用中速度很快,效果很好。该算法基于常见的“虫随”法进行改进,具有以下优点:既能有效跟踪外边界又能克服内边界的存在对算法的影响。对于不封闭的线段能实现很好的跟踪算法思路:边界跟踪从二值图像的左上角点还是逐点扫描,当遇到目标点是开始顺序跟踪。封闭轮廓直至跟踪的后续点回到起始点。对于非封闭轮廓其后续点再没有新的后续点...原创 2020-03-31 19:53:33 · 5592 阅读 · 0 评论