opencv学习——Moments()函数,计算物体形状方向

opencv中的矩主要包括以下几种:空间矩,中心矩和中心归一化矩。
class Moments { public: …

// 空间矩

double m00, m10, m01, m20, m11, m02, m30, m21, m12, m03;

// 中心矩

double mu20, mu11, mu02, mu30, mu21, mu12, mu03;

// 中心归一化矩 double nu20, nu11, nu02, nu30, nu21, nu12, nu03;

}
**针对一幅图像,我们把像素的坐标看成是一个二维随机变量(X, Y),那么一副灰度图可以用二维灰度图密度函数来表示,因此可以用矩来描述灰度图像的特征。**图像可以看成是一个平板的物体,其一阶矩和零阶矩就可以拿来计算某个形状的重心,而二阶矩就可以拿来计算形状的方向。
在这里插入图片描述
其中M00即零阶矩,M20和M02为二阶矩,接下来计算物体形状的方向
在这里插入图片描述
在这里插入图片描述

#region 三角函数和反三角函数
 
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Messaging;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 正弦、反正弦
            //正弦
            double sinAngleValue1 = 30;//角度值:30度。
            double sinRadianValue1 = Math.PI * sinAngleValue1 / 180;//求弧度值
            double sinValue1 = Math.Sin(sinRadianValue1);//求sin30度,其实sin30度 = sin(PI/6),但是,数学上或代码上,常常用弧度PI/6,来计算sin(PI/6),其他函数同理。
            Console.WriteLine(sinValue1);
            //反正弦
            double sinValue2 = 0.5;//正弦值 = 0.5。
            double sinRadianValue2 = Math.Asin(sinValue2);//求弧度值
            double sinAngleValue2 = sinRadianValue2 / Math.PI * 180;//根据弧度值,来求角度值。
            Console.WriteLine(sinAngleValue2);
            Console.WriteLine();
            #endregion
 
            #region 正切、反正切
            Console.WriteLine();
            Console.WriteLine();
            //正切
            double tanAngleValue1 = 15;//角度值
            double tanRadianValue1 = Math.PI * tanAngleValue1 / 180;//求弧度值
            double tanValue1 = Math.Tan(tanRadianValue1);//tan值
            Console.WriteLine(tanValue1);//tan值
 
            double tanValue2 = 1;//正切值
            double tanRadianValue2 = Math.Atan(tanValue2);//求弧度值
            double tanAngleValue2 = tanRadianValue2 / Math.PI *180;//求角度
            Console.WriteLine(tanAngleValue2);
            #endregion
            Console.ReadLine();
        }
    }
}
#endregion

在这里插入图片描述
在这里插入图片描述

### 关于OpenCV中XLD模板匹配的使用方法 需要注意的是,实际上OpenCV本身并不直接提供名为“XLD”的功能或函数;这一概念更多地与HALCON等其他计算机视觉库关联[^4]。然而,在讨论基于形状和边缘的高级模板匹配技术时,可以借鉴相似的理念应用于OpenCV环境。 对于想要在OpenCV框架内实现类似于XLD的功能,可以通过组合多种现有工具和技术来达成目的: #### 1. 边缘检测 为了模拟XLD轮廓提取的效果,可先应用Canny算子或其他边缘检测器获取图像中的显著边界信息。 ```cpp cv::Mat edges; cv::Canny(image, edges, threshold1, threshold2); ``` #### 2. 轮廓发现 接着从二值化后的边缘图中找到闭合轮廓,并筛选出符合条件的目标对象作为模板。 ```cpp std::vector<std::vector<cv::Point>> contours; std::vector<cv::Vec4i> hierarchy; findContours(edges, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); ``` #### 3. 特征描述符计算 针对选定的模板及其候选区域内的对应部分,计算诸如Hu矩之类的不变量特征向量用于后续比较。 ```cpp cv::Moments mu = moments(contour); cv::Vec<double,7> huMoments = HuMoments(mu); ``` #### 4. 匹配过程 最后一步涉及遍历待测图片上的各个位置,重复上述操作并评估两者间的相似程度,从而定位最佳匹配点。 ```cpp double minDist = DBL_MAX; int bestIdx=-1; for(size_t i=0;i<contours.size();++i){ double dist = norm(huModel-huCandiates[i]); if(dist < minDist){minDist=dist;bestIdx=i;} } ``` 尽管这不是严格意义上的XLD实现方式,但在缺乏官方支持的情况下,这种方法能够有效地模仿其核心原理——即依赖于物体外形而非单纯像素强度来进行识别。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值