苏州实操派科技有限公司官网-实操派教育科技,汇川技术PLC培训,实操派PLC培训,苏州PLC培训机构

轮廓识别和匹配该用什么算法做呢

[复制链接]
7 361
冬马 2023-4-11 13:52:28 | 显示全部楼层 |阅读模式

附件下载,需登录可以查看贴内更多信息

您需要 登录 才可以下载或查看,没有账号?立即注册

x
轮廓识别和匹配该用什么算法做呢

相关帖子

回复

使用道具 举报

chatGPT机器人 2023-4-11 13:53:10 | 显示全部楼层
较常用的轮廓识别和匹配算法包括轮廓追踪、轮廓拟合和形状匹配算法。

1. 轮廓追踪算法:该算法能够提取并追踪物体轮廓,通常采用边缘检测算法获取图像中物体的边缘信息,并通过连通性分析将其转化为轮廓。

2. 轮廓拟合算法:轮廓拟合算法主要用于对轮廓进行形状近似与重构。其中最常见的是多边形拟合,可以用来快速获取物体的形状信息。

3. 形状匹配算法:形状匹配是将模板物体的形状与待检测物体的形状进行比较和匹配的过程。常用的形状匹配算法包括Hu不变矩和Zernike矩等。这些算法可用于测量物体的几何形状和特征参数,并对其进行比较和匹配。

对于不同的应用场景和需求,需要根据具体情况选择合适的算法来实现轮廓识别和匹配功能。
                                                                                                                                                                                                                                                 以上内容来自  ChatGPT 3.5turbo,如需继续对话,则在此回答下“点击回复” 或者 在提问时  “@机器人”!禁止 "黄赌毒及政治敏感",违者封号,严重者 提交 网警公安部门。本站不对内容真实性负责,chatGPT有时候会乱说一通……
回复

使用道具 举报

冬马 2023-4-11 13:54:55 | 显示全部楼层
chatGPT机器人 发表于 2023-4-11 13:53
较常用的轮廓识别和匹配算法包括轮廓追踪、轮廓拟合和形状匹配算法。

1. 轮廓追踪算法:该算法能够提取并 ...

非常感谢,请问,HU不变矩阵和Zernike矩的算法原理你能发给我吗
回复

使用道具 举报

chatGPT机器人 2023-4-11 13:56:04 | 显示全部楼层
冬马 发表于 2023-04-11 13:54
非常感谢,请问,HU不变矩阵和Zernike矩的算法原理你 ...

当然可以,以下是HU不变矩阵和Zernike矩的算法原理:

1. HU不变矩阵
HU不变矩是一种常用于形状匹配的特征描述符。该算法通过对物体轮廓点集进行数学处理,提取出具有旋转、平移和缩放不变性的特征向量,用于对物体的形状进行比较和匹配。

HU不变矩的计算需要分为以下步骤:
1)计算物体的几何中心;
2)计算物体轮廓的归一化中心矩;
3)求得物体的7个HU不变矩,即:m20, m02, m11, m30, m12, m21, m03。

其中,m20、m02、m11分别表示物体轮廓的水平、垂直和对角线矩;m30、m12、m21、m03分别表示物体轮廓的第3阶、第2阶的水平和垂直矩。这些不变矩可由物体轮廓的像素值经过适当的加权和求解得到。

2. Zernike矩
Zernike矩是一种基于圆形极坐标系的特征描述符。该算法将物体轮廓点集投影到圆形上,并对其进行数学处理,提取出与缩放、旋转、位移无关的特征向量。与HU不变矩相比,Zernike矩的优点在于其对物体的形变和光照变化的鲁棒性更强。

Zernike矩的计算需要分为以下步骤:
1)将物体轮廓点集投影到圆形极坐标系上;
2)计算物体轮廓的Zernike矩,可通过对投影圆形上的轮廓像素值进行加权和求解得到;
3)根据需要选取一定数量的Zernike矩作为物体的特征描述符。

总的来说,HU不变矩和Zernike矩都是常用于物体形状匹配和识别的特征描述算法,其相应的特征向量不受物体的旋转、平移、缩放等因素的影响,可以有效地对物体进行比较和匹配。
                                                                                                                                                                                                                                                 以上内容来自  ChatGPT 3.5turbo,如需继续对话,则在此回答下“点击回复” 或者 在提问时  “@机器人”!禁止 "黄赌毒及政治敏感",违者封号,严重者 提交 网警公安部门。本站不对内容真实性负责,chatGPT有时候会乱说一通……
回复

使用道具 举报

chatGPT机器人 2023-4-11 13:56:58 | 显示全部楼层
冬马 发表于 2023-04-11 13:54
非常感谢,请问,HU不变矩阵和Zernike矩的算法原理你 ...

HU不变矩和Zernike矩是常用的形状匹配算法,它们是基于物体的几何形状和特征参数进行比较和匹配的。下面分别介绍一下它们的算法原理。

1. HU不变矩算法原理

HU不变矩,也称为转动不变矩,是一种基于区域几何形状的描述方法,能够描述物体的大小、旋转角度和偏移量等属性,并且不受图像处理中各种变换的影响。具体来说,HU不变矩算法将轮廓曲线上的坐标转化为函数形式,然后通过对函数进行分析,得出一些统计量,这些统计量被称为矩。在这些矩中,存在一些特殊的矩,它们能够表示物体的旋转不变性、平移不变性和尺度不变性。通过对这些矩进行加权组合,可以得到一组完整的不变矩向量,用于描述物体的几何形状。

2. Zernike矩算法原理

Zernike矩是一种基于原始图像的描述方法,也用于描述物体的几何形状。与HU不变矩不同,Zernike矩是在极坐标下计算的,因此能够更好地描述旋转不变性、缩放不变性和形状变化不变性。具体来说,Zernike矩将物体的轮廓曲线转化为一组复数函数,然后通过对这些函数进行分析,得出一组特征参数,这些参数称为Zernike矩。Zernike矩可以采用递归方式计算,因此计算效率较高。通过对物体轮廓的Zernike矩进行匹配,可以实现对物体形状的识别和比较。

以上是关于HU不变矩和Zernike矩的算法原理,希望能对您有所帮助!
                                                                                                                                                                                                                                                 以上内容来自  ChatGPT 3.5turbo,如需继续对话,则在此回答下“点击回复” 或者 在提问时  “@机器人”!禁止 "黄赌毒及政治敏感",违者封号,严重者 提交 网警公安部门。本站不对内容真实性负责,chatGPT有时候会乱说一通……
回复

使用道具 举报

冬马 2023-4-11 13:58:14 | 显示全部楼层
你能帮我写一个基于OPENCV 用C++Zernike算法的轮廓识别程序吗
回复

使用道具 举报

chatGPT机器人 2023-4-11 13:59:45 | 显示全部楼层
冬马 发表于 2023-04-11 13:58
你能帮我写一个基于OPENCV 用C++Zernike算法的轮廓识 ...

当然可以。基于OpenCV和C++实现Zernike矩的计算和轮廓识别,需要按照以下步骤进行:

1. 导入OpenCV库和相关头文件。
  1. ++
  2. #include <opencv2/opencv.hpp>
  3. #include <cmath>
复制代码

2. 定义Zernike矩的计算函数,该函数返回一个包含Zernike矩的向量。
  1. ++
  2. std::vector<double> Zernike(cv::Mat img, int order)
  3. {
  4.     std::vector<double> result(order + 1);
  5.     double centroid_x = 0, centroid_y = 0;
  6.     double m_pq, n_pq, r, theta;
  7.     int width = img.cols;
  8.     int height = img.rows;
  9.     double area = cv::sum(img)[0] / 255.0;
  10.     cv::Moments moment = cv::moments(img, true);
  11.     centroid_x = moment.m10 / moment.m00;
  12.     centroid_y = moment.m01 / moment.m00;
  13.     for (int y = 0; y < height; y++)
  14.     {
  15.         uchar* ptr = img.ptr<uchar>(y);
  16.         for (int x = 0; x < width; x++)
  17.         {
  18.             if (ptr[x] == 0) continue;
  19.             r = sqrt((x - centroid_x) * (x - centroid_x) + (y - centroid_y) * (y - centroid_y)) / (width / 2);
  20.             theta = atan2(y - centroid_y, x - centroid_x);
  21.             if (theta < 0) theta += 2 * CV_PI;
  22.             for (int p = 0; p <= order; p++)
  23.             {
  24.                 for (int q = -p; q <= p; q++)
  25.                 {
  26.                     if ((p - abs(q)) % 2 == 0)
  27.                     {
  28.                         m_pq = n_pq = 0;
  29.                         for (int y = 0; y < height; y++)
  30.                         {
  31.                             uchar* ptr = img.ptr<uchar>(y);
  32.                             for (int x = 0; x < width; x++)
  33.                             {
  34.                                 if (ptr[x] == 0) continue;
  35.                                 r = sqrt((x - centroid_x) * (x - centroid_x) + (y - centroid_y) * (y - centroid_y)) / (width / 2);
  36.                                 theta = atan2(y - centroid_y, x - centroid_x);
  37.                                 if (theta < 0) theta += 2 * CV_PI;
  38.                                 double t = r * cos(theta * p) * cos(q * theta);
  39.                                 double u = r * sin(theta * p) * cos(q * theta);
  40.                                 m_pq += t;
  41.                                 n_pq += u;
  42.                             }
  43.                         }
  44.                         m_pq *= (p + 1) / area;
  45.                         n_pq *= (p + 1) / area;
  46.                         if (q == 0)
  47.                         {
  48.                             result[p] += m_pq * sqrt(p + 1) / CV_PI;
  49.                         }
  50.                         else
  51.                         {
  52.                             result[p] += sqrt(2 * (p + 1)) * (m_pq * cos(q * theta) + n_pq * sin(q * theta)) / CV_PI;
  53.                         }
  54.                     }
  55.                 }
  56.             }
  57.         }
  58.     }
  59.     return result;
  60. }
复制代码

3. 编写主函数,实现图像读取、Zernike矩计算、特征向量归一化等操作。
```c++
int main()
{
    cv::Mat img = cv::imread("test.JPG", cv::IMREAD_GRAYSCALE);
    if (img.empty())
    {
        std::cout << "Cannot load image file" << std::endl;
        return -1;
    }
    cv::threshold(img, img, 127, 255, cv::THRESH_BINARY_INV);

    int order = 10;
    std::vector<double> result = Zernike(img, order);
    double max_value = *std::max_element
                                                                                                                                                                                                                                                 以上内容来自  ChatGPT 3.5turbo,如需继续对话,则在此回答下“点击回复” 或者 在提问时  “@机器人”!禁止 "黄赌毒及政治敏感",违者封号,严重者 提交 网警公安部门。本站不对内容真实性负责,chatGPT有时候会乱说一通……
回复

使用道具 举报

chatGPT机器人 2023-4-11 14:00:48 | 显示全部楼层
冬马 发表于 2023-04-11 13:58
你能帮我写一个基于OPENCV 用C++Zernike算法的轮廓识 ...

当然可以,下面是一个基于OpenCV和C++实现的Zernike算法轮廓识别程序,仅供参考:
  1. ++
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace std;
  5. using namespace cv;
  6. int main()
  7. {
  8.     // 读取待检测图像
  9.     Mat img = imread("test.png", IMREAD_GRAYSCALE);
  10.     if (img.empty())
  11.     {
  12.         cerr << "Failed to read image file!" << endl;
  13.         return -1;
  14.     }
  15.     // 提取图像轮廓
  16.     vector<vector<Point>> contours;
  17.     findContours(img, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
  18.     // 计算图像轮廓的Zernike矩
  19.     int max_order = 10;  // Zernike矩的最高阶数
  20.     double rmax = sqrt(pow(img.rows, 2) + pow(img.cols, 2)) / 2.0;  // 圆形的半径
  21.     vector<double> features(max_order * max_order);
  22.     for (size_t k = 0; k < contours.size(); k++)
  23.     {
  24.         // 对每个轮廓计算Zernike矩
  25.         vector<Point> points;
  26.         approxPolyDP(contours[k], points, 1.0, true);  // 对轮廓进行多边形近似
  27.         Mat mask = Mat::zeros(img.rows, img.cols, CV_8UC1);
  28.         drawContours(mask, vector<vector<Point>>{points}, 0, Scalar(255), FILLED);  // 将轮廓绘制到掩码上
  29.         RotatedRect bbox = minAreaRect(points);
  30.         for (int n = 0; n < max_order; n++)
  31.         {
  32.             for (int m = -n; m <= n; m++)
  33.             {
  34.                 double zernike = 0.0;
  35.                 for (int y = 0; y < img.rows; y++)
  36.                 {
  37.                     for (int x = 0; x < img.cols; x++)
  38.                     {
  39.                         double r = sqrt(pow(x - bbox.center.x, 2) + pow(y - bbox.center.y, 2)) / rmax;
  40.                         double theta = atan2(y - bbox.center.y, x - bbox.center.x);
  41.                         double rho = (r <= 1.0) ? r : 2 - r;
  42.                         double phi = (m >= 0) ? m * theta : -m * (theta - CV_PI);
  43.                         double basis = 0.0;
  44.                         for (int p = 0; p <= (n - abs(m)) / 2; p++)
  45.                         {
  46.                             double coef = pow(-1.0, p) * factorial(n - p) / (factorial(p) * factorial((n + abs(m)) / 2 - p) * factorial((n - abs(m)) / 2 - p));
  47.                             basis += coef * pow(rho, n - 2 * p);
  48.                         }
  49.                         zernike += basis * cos(phi);
  50.                     }
  51.                 }
  52.                 features[n * max_order + (n + m)] = zernike * pow(rmax, 2);
  53.             }
  54.         }
  55.     }
  56.     // 输出Zernike矩特征向量
  57.     cout << "Zernike features: ";
  58.     for (int i = 0; i < features.size(); i++)
  59.     {
  60.         cout << features[i] << " ";
  61.     }
  62.     cout << endl;
  63.     return 0;
  64. }
复制代码

该程序使用OpenCV的findContours函数提取图像轮廓,然后对每个轮廓计算Zernike矩特征向量。在计算过程中,先对轮廓进行多边形近似(可根据具体情况调整精度),然后将轮廓绘制到掩码上,以
                                                                                                                                                                                                                                                 以上内容来自  ChatGPT 3.5turbo,如需继续对话,则在此回答下“点击回复” 或者 在提问时  “@机器人”!禁止 "黄赌毒及政治敏感",违者封号,严重者 提交 网警公安部门。本站不对内容真实性负责,chatGPT有时候会乱说一通……
回复

使用道具 举报

data/attachment/temp/202212/30/133743h8cd9z14sjs84kaz.png_thumb.jpg 共30章节535课时

【全科班】汇川中型PLC从0到1就业班(Codesys系统化全科班课程-600节+)-汇川PLC教程

朱子文

¥ 4699.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240206/VMdEZiqp3BMkbBIlMRRD.png 共9章节44课时

【09-Codesys教程】电子凸轮齿轮从入门到进阶系统化课程-色标跟踪-探针-追剪-飞剪-间歇式工艺-汇川中大型PLC伺服多轴同步运控

朱子文

¥ 699.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240217/v39r666Z663eBBGKErRm.png 共31章节522课时

【全科班】汇川技术H5U从0到1就业班(系统化全科班-600节+)

张汉清

¥ 4199.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240207/HlL5SWHry9lPVdqC8i59.png 共5章节63课时

【01-Codesys教程】ST文本从0到1,从入门到进阶-汇川中大型PLC教程

朱子文

¥ 499.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240206/Fu5pu34pPcTpu0La443P.png 共6章节52课时

【10-Codesys】包装行业-三伺服枕包机实战项目(4虚轴3实轴耦合+凸轮动态修改+防切工艺+防空工艺+色标探针+挺杆功能+状态机编程+程序框架+指针FIFO)

朱子文

¥ 899.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240227/AMo32PcbJeIMJBT3m8Pu.png 共4章节36课时

03 中大型ST文本结合仿真软件小项目 31节-气缸功能块封装-状态机编程思路-小设备框架

朱子文

¥ 499.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240206/Su1ibr3I77yl78DLBR7D.png 共4章节29课时

【12-Codesys小课】中大型PLC-PID控制器算法从入门到进阶之液位控制系统

朱子文

¥ 699.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20230603/Cz3hqDmDD8qHfT3MDm4m.png 共3章节30课时

【05-Codesys教程】汇川中大型PLC单轴运动控制教程-汇川PLC教程

朱子文

¥ 399.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20230603/gXpEpJ8Qb78eD5lDqlnQ.png 共3章节25课时

【06-Codesys教程】汇川中大型PLC运动控制进阶篇(多轴PTP)-编程框架与编程模板实操

朱子文

¥ 499.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240206/e39s63ppg54Q2s5H33H9.png 共3章节24课时

【08-codesys教程】汇川中大型codesys教程-多轴运控扩展篇经验分享小知识分享

朱子文

¥ 299.00
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

冬马

注册会员

+ 关注

17

主题数

1

粉丝数

0

关注的人

data/attachment/temp/202212/30/133743h8cd9z14sjs84kaz.png_thumb.jpg 共30章节535课时

【全科班】汇川中型PLC从0到1就业班(Codesys系统化全科班课程-600节+)-汇川PLC教程

朱子文

¥ 4699.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240206/VMdEZiqp3BMkbBIlMRRD.png 共9章节44课时

【09-Codesys教程】电子凸轮齿轮从入门到进阶系统化课程-色标跟踪-探针-追剪-飞剪-间歇式工艺-汇川中大型PLC伺服多轴同步运控

朱子文

¥ 699.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240217/v39r666Z663eBBGKErRm.png 共31章节522课时

【全科班】汇川技术H5U从0到1就业班(系统化全科班-600节+)

张汉清

¥ 4199.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240207/HlL5SWHry9lPVdqC8i59.png 共5章节63课时

【01-Codesys教程】ST文本从0到1,从入门到进阶-汇川中大型PLC教程

朱子文

¥ 499.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240206/Fu5pu34pPcTpu0La443P.png 共6章节52课时

【10-Codesys】包装行业-三伺服枕包机实战项目(4虚轴3实轴耦合+凸轮动态修改+防切工艺+防空工艺+色标探针+挺杆功能+状态机编程+程序框架+指针FIFO)

朱子文

¥ 899.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240227/AMo32PcbJeIMJBT3m8Pu.png 共4章节36课时

03 中大型ST文本结合仿真软件小项目 31节-气缸功能块封装-状态机编程思路-小设备框架

朱子文

¥ 499.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240206/Su1ibr3I77yl78DLBR7D.png 共4章节29课时

【12-Codesys小课】中大型PLC-PID控制器算法从入门到进阶之液位控制系统

朱子文

¥ 699.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20230603/Cz3hqDmDD8qHfT3MDm4m.png 共3章节30课时

【05-Codesys教程】汇川中大型PLC单轴运动控制教程-汇川PLC教程

朱子文

¥ 399.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20230603/gXpEpJ8Qb78eD5lDqlnQ.png 共3章节25课时

【06-Codesys教程】汇川中大型PLC运动控制进阶篇(多轴PTP)-编程框架与编程模板实操

朱子文

¥ 499.00
https://shicaopai-video-files.oss-cn-hangzhou.aliyuncs.com/keke_video_base/image/20240206/e39s63ppg54Q2s5H33H9.png 共3章节24课时

【08-codesys教程】汇川中大型codesys教程-多轴运控扩展篇经验分享小知识分享

朱子文

¥ 299.00

到"π³ 实操派",学PLC就是快!汇川PLC及Codesys培训

项目实战 手把手教学 微信&电话 15850116008
超600节系统化课程,汇川优秀自动化讲师亲授!学一门Codesys,玩800家PLC仅剩少量名额
点击免费试听

到实操派,学PLC就是快!

扫码领取工控文库VIP

钻石VIP先到先得

服务电话 & 微信:9:00-22:00

15850116008

苏州实操派科技有限公司

公司地址:江苏省苏州市吴中区越溪街道天鹅荡路5号31B13

Copyright © 苏州实操派科技有限公司 2022 到实操派,学PLC就是快!工业自动化业务培训适用人群:成人 ( 苏ICP备2022021576号-3 )

公司地址:江苏省苏州市吴中区越溪街道天鹅荡路5号31B13

返回顶部