M = cv2.moments(contour)具体用法
时间: 2023-02-08 13:40:51 浏览: 312
在 Python 中使用 OpenCV 库时,使用 `cv2.moments()` 函数可以计算图像轮廓的矩。
该函数的输入是一个轮廓,输出是一个字典,包含了轮廓的各种矩信息。
例如,你可以这样使用该函数:
```python
import cv2
# 使用 cv2.imread() 读入图像
img = cv2.imread("image.jpg")
# 使用 cv2.findContours() 找到图像的轮廓
contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 对于每一个轮廓,使用 cv2.moments() 计算矩
for contour in contours:
M = cv2.moments(contour)
# 使用 M["m00"] 访问第 0 阶矩
# 使用 M["m10"] 访问第 1 阶矩
# 使用 M["m01"] 访问第 2 阶矩
# 以此类推
```
可以使用计算出的矩来计算轮廓的重心、长宽比、旋转角度等信息。
相关问题
opencv形状匹配
OpenCV 提供了形状匹配的功能,可以在图像中寻找与给定形状最相似的轮廓。以下是一些使用 OpenCV 进行形状匹配的步骤:
1. 加载图像并进行预处理:使用 OpenCV 的 imread() 函数加载图像,并进行必要的预处理操作,例如灰度转换、二值化等。
2. 寻找轮廓:利用 findContours() 函数找到图像中的轮廓。确保选择适当的轮廓检测模式和轮廓近似方法。
3. 计算特征:使用 OpenCV 的 moments() 函数计算每个轮廓的矩特征。矩特征包括中心矩、归一化中心矩等。
4. 形状匹配:对于每个轮廓,可以使用 matchShapes() 函数来计算其与给定形状的匹配程度。此函数返回一个匹配值,可以用于比较不同轮廓之间的相似性。
下面是一个简单的示例代码,展示了如何在 OpenCV 中进行形状匹配:
```python
import cv2
# 加载图像
image = cv2.imread("image.jpg")
# 灰度转换
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 寻找轮廓
contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 加载给定的形状图像
template = cv2.imread("template.jpg", 0)
# 计算形状特征
template_contours, template_hierarchy = cv2.findContours(template, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
template_moment = cv2.moments(template_contours[0])
# 形状匹配
for contour in contours:
moment = cv2.moments(contour)
match = cv2.matchShapes(moment, template_moment, cv2.CONTOURS_MATCH_I1, 0)
print("Match value:", match)
```
请注意,上述示例中的图像路径应根据实际情况进行修改。此外,还可以根据需要调整阈值、轮廓检测模式和轮廓近似方法,以获取更好的形状匹配结果。
我要的是opencv MatchShapes的例子 C#语言的
当然,我可以为您提供一个使用C#语言的OpenCV MatchShapes函数的示例。请参考以下代码:
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;
namespace MatchShapesExample
{
class Program
{
static void Main(string[] args)
{
// 读取模板和测试图像
var template = Cv2.ImRead("template.png", ImreadModes.Grayscale);
var testImage = Cv2.ImRead("test_image.png", ImreadModes.Grayscale);
// 提取轮廓
var templateContours = new List<Point[]>();
var testContours = new List<Point[]>();
Cv2.FindContours(template, out templateContours, out _, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
Cv2.FindContours(testImage, out testContours, out _, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
// 计算轮廓的Hu矩
var templateHuMoments = new List<Moments>();
var testHuMoments = new List<Moments>();
foreach (var contour in templateContours)
{
var moments = Cv2.Moments(contour);
var huMoments = Cv2.GetHuMoments(moments);
templateHuMoments.Add(huMoments);
}
foreach (var contour in testContours)
{
var moments = Cv2.Moments(contour);
var huMoments = Cv2.GetHuMoments(moments);
testHuMoments.Add(huMoments);
}
// 计算轮廓的形状相似度
var minShapeSimilarity = double.MaxValue;
foreach (var templateHu in templateHuMoments)
{
foreach (var testHu in testHuMoments)
{
var shapeSimilarity = Cv2.MatchShapes(templateHu, testHu, ContoursMatchType.I1);
if (shapeSimilarity < minShapeSimilarity)
{
minShapeSimilarity = shapeSimilarity;
}
}
}
Console.WriteLine($"最小形状相似度: {minShapeSimilarity}");
Cv2.WaitKey(0);
}
}
}
```
在这个示例中,我们首先读取了模板图像和测试图像(请将文件名替换为实际的图像文件名)。然后,我们使用`Cv2.FindContours`函数提取图像的轮廓。接下来,我们计算每个轮廓的Hu矩,使用`Cv2.GetHuMoments`函数。
最后,我们使用`Cv2.MatchShapes`函数计算模板和测试图像之间的形状相似度。这个函数的第三个参数指定了比较形状的方法,这里我们使用了`ContoursMatchType.I1`。最后,我们输出最小的形状相似度。
请确保您已经安装了OpenCvSharp库,并将代码中的文件名替换为实际的图像文件名。希望对您有帮助!如果还有其他问题,请随时问我。