gpt4 book ai didi

emgucv - 转换使用 EMGU.CV 找到的轮廓

转载 作者:行者123 更新时间:2023-12-01 13:06:57 25 4
gpt4 key购买 nike

我是 EMGU.CV 的新手,我有点挣扎。让我先介绍一下该项目的背景,我正在尝试跟踪用户的手指,即计算用户的指尖,但我有点挣扎。我创建了一组代码,仅将深度信息过滤到特定范围,并生成位图图像 tempBitmap,然后我使用 EMGU.CV 将此图像转换为灰度图像,cvCanny 可以使用它。完成此操作后,我对 canny 图像应用扩张过滤器以加厚手的轮廓,以更好地提高生成成功轮廓的机会,然后我尝试获取手的轮廓。现在我设法做的是在手周围画一个框,但我正在努力寻找一种方法将 FindContours 生成的轮廓转换为一组我可以用来绘制轮廓的点。变量 depthImage2 是一个位图图像变量,我在将其分配给基于 C# 表单的应用程序上的 picturebox 变量之前用于绘制。您可以提供给我的任何信息或指导将不胜感激,如果我的代码不正确,可能会指导我朝着可以计算指尖的方向发展。我想我快到了,我只是错过了一些东西,所以任何形式的帮助都将不胜感激。

Image<Bgr, Byte> currentFrame = new Image<Bgr, Byte>(tempBitmap);

Image<Gray, Byte> grayImage = currentFrame.Convert<Gray, Byte>().PyrDown().PyrUp();
Image<Gray, Byte> cannyImage = new Image<Gray, Byte>(grayImage.Size);
CvInvoke.cvCanny(grayImage, cannyImage, 10, 60, 3);

StructuringElementEx kernel = new StructuringElementEx(
3, 3, 1, 1, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_ELLIPSE);

CvInvoke.cvDilate(cannyImage, cannyImage, kernel, 1);

IntPtr cont = IntPtr.Zero;

Graphics graphicsBitmap = Graphics.FromImage(depthImage2);

using (MemStorage storage = new MemStorage()) //allocate storage for contour approximation
for (Contour<Point> contours =
cannyImage.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,
Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_EXTERNAL);
contours != null; contours = contours.HNext)
{
IntPtr seq = CvInvoke.cvConvexHull2(contours, storage.Ptr, Emgu.CV.CvEnum.ORIENTATION.CV_CLOCKWISE, 0);
IntPtr defects = CvInvoke.cvConvexityDefects(contours, seq, storage);
Seq<Point> tr = contours.GetConvexHull(Emgu.CV.CvEnum.ORIENTATION.CV_CLOCKWISE);

Seq<Emgu.CV.Structure.MCvConvexityDefect> te = contours.GetConvexityDefacts(
storage, Emgu.CV.CvEnum.ORIENTATION.CV_CLOCKWISE);

graphicsBitmap.DrawRectangle(
new Pen(new SolidBrush(Color.Red)), tr.BoundingRectangle);
}

最佳答案

Contour contours = cannyImage.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_NONE)//返回所有点

然后:

List<Point[]> convertedContours = new List<Point[]>();
while(cotours!=null)
{
var contourPoints = contours.ToArray(); //put Seq<Point> to Point[], ToList() is also available ?
convertedContours.Add(contourpoints);

contours = contours.HNext;
}

可以通过重载imageDraw函数来绘制轮廓。只需找到包含参数 Seq<>

的签名

....

关于emgucv - 转换使用 EMGU.CV 找到的轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16733772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com