Emgu CV 3 findContours and hierarchy parameter of type Vec4i equivalent?

后端 未结 3 1923
我寻月下人不归
我寻月下人不归 2020-12-15 13:54

I\'m attempting to translate the following OpenCV C++ code into Emgu CV 3:

std::vector > contours;
std::vector

        
3条回答
  •  没有蜡笔的小新
    2020-12-15 14:36

    Pass a default-constructed Mat to get the hierarchy.

    var VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
    var Mat hierarchy = new Mat();
    CvInvoke.FindContours(
        image,
        contours,
        hierarchy,
        RetrType.Ccomp,
        ChainApproxMethod.ChainApproxSimple
        );
    
    Console.WriteLine("contours.Size: " + contours.Size);
    Console.WriteLine("hierarchy.Rows: " + hierarchy.Rows);
    Console.WriteLine("hierarchy.Cols: " + hierarchy.Cols);
    Console.WriteLine("hierarchy.Depth: " + hierarchy.Depth);
    Console.WriteLine("hierarchy.NumberOfChannels: " + hierarchy.NumberOfChannels);
    
    // Example Output:
    // contours.Size: 4391
    // hierarchy.Rows: 1
    // hierarchy.Cols: 4391
    // hierarchy.Depth: Cv32S
    // hierarchy.NumberOfChannels: 4
    

    You can access the hierarchy data using the Mat DataPointer:

        /// 
        /// Get a neighbor index in the heirarchy tree.
        /// 
        /// 
        /// A neighbor index or -1 if the given neighbor does not exist.
        /// 
        public int Get(HierarchyIndex component, int index)
        {
            if (Hierarchy.Depth != Emgu.CV.CvEnum.DepthType.Cv32S)
            {
                throw new ArgumentOutOfRangeException("ContourData must have Cv32S hierarchy element type.");
            }
            if (Hierarchy.Rows != 1)
            {
                throw new ArgumentOutOfRangeException("ContourData must have one hierarchy hierarchy row.");
            }
            if (Hierarchy.NumberOfChannels != 4)
            {
                throw new ArgumentOutOfRangeException("ContourData must have four hierarchy channels.");
            }
            if (Hierarchy.Dims != 2)
            {
                throw new ArgumentOutOfRangeException("ContourData must have two dimensional hierarchy.");
            }
            long elementStride = Hierarchy.ElementSize / sizeof(Int32);
            var offset = (long)component + index * elementStride;
            if (0 <= offset && offset < Hierarchy.Total.ToInt64() * elementStride)
            {
                unsafe
                {
                    return *((Int32*)Hierarchy.DataPointer.ToPointer() + offset);
                }
            }
            else
            {
                return -1;
            }
        }
    

    https://gist.github.com/joshuanapoli/8c3f282cece8340a1dd43aa5e80d170b

提交回复
热议问题