【问题标题】:How can I do Hough Transform in OpenCV and C#?如何在 OpenCV 和 C# 中进行霍夫变换?
【发布时间】:2016-10-05 12:09:16
【问题描述】:

关于这个Opencv Tutorial,下面的C++代码sn-p:

vector<Vec4i> lines;
           // Find hough lines 
    HoughLinesP(edges, lines, 1, CV_PI / 180, 100, 100, 10);

           // Prepare blank mat with same sizes as image
    Mat Blank(image.rows, image.cols, CV_8UC3, Scalar(0, 0, 0));

       // Draw lines into image and Blank images
        for (size_t i = 0; i < lines.size(); i++)
         {
        Vec4i l = lines[i];

        line(image, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 0), 2, CV_AA);

         line(Blank, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(255, 255, 255), 2, CV_AA);

         }

已经像这样被翻译成C#:

private void openFileDialogButton_Click(object sender, EventArgs e)
{
    try
    {
        const string filename = @"E:\___MSc in Computer Systems & Network\EMSC1,2,3\lena.png";

        Mat image = Cv2.ImRead(filename, LoadMode.GrayScale);

        Mat edges = new Mat();

        Cv2.Canny(image, edges, 95, 100);

        Cv2.ImWrite("edges.jpg", edges);

        Mat dx = new Mat();
        Mat dy = new Mat();

        Cv2.Sobel(edges, dx, MatType.CV_32F, 1, 0);
        Cv2.Sobel(edges, dy, MatType.CV_32F, 0, 1);

        Cv2.ImWrite("dx.jpg", dx);
        Cv2.ImWrite("dy.jpg", dy);

        Mat linesssssss = new Mat();

        Cv.HoughLines2((CvArr)linesssssss.ToIplImage(),
            (CvMat)edges,
            HoughLinesMethod.Standard,
            1,
            Math.PI / 180,
            100, 100, 10);
        //Cv2.HoughLinesP(edges, lines, 1, Math.PI / 180, 100, 100, 10);

        List<Vec4i> lines = IntPtrToList(linesssssss.Data);

        Mat Blank = new Mat(image.Rows, image.Cols, MatType.CV_8UC3, new Scalar(0, 0, 0));

        for (int i = 0; i < lines.Count; i++)
        {
            Vec4i l = lines[i];

            Cv2.Line(image, new OpenCvSharp.CPlusPlus.Point(l[0], l[1]), new OpenCvSharp.CPlusPlus.Point(l[2], l[3]), new Scalar(0, 0, 0), 2, Cv.AA);

            Cv2.Line(Blank, new OpenCvSharp.CPlusPlus.Point(l[0], l[1]), new OpenCvSharp.CPlusPlus.Point(l[2], l[3]), new Scalar(255, 255, 255), 2, Cv.AA);

        }

        //Cv2.ImWrite("houg.jpg", image);
        //Cv2.ImShow("Edges", image);
        //Cv2.ImWrite("houg2.jpg", Blank);
        //Cv2.ImShow("Edges Structure", Blank);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

不幸的是,它似乎无法正常工作。它给出了以下例外:

Nonpositive cols or rows

这是文章的原图:

【问题讨论】:

  • 你看看错误实际上是什么意思吗?
  • @theB,参数的数量不同。我尝试了各种参数和数据类型的组合。它们都没有真正起作用。我发布的代码实际上显示的错误最少。
  • 抱歉,无法阅读那个小文字。用放大镜我可以告诉你,它告诉你线条应该是CvArr,边缘应该是CvMat
  • 改进此问题的建议:--- 在寻求调试帮助时,始终包括完整的异常名称和堆栈跟踪,而不仅仅是 ex.Message --- 用注释标记异常发生的行--- 删除异常之后的所有行和异常不需要的所有行,直到你有一个最小的代码示例 --- 将发生异常的行分解为尽可能多的子命令,即@987654330 @ --> CvArr l2 = CvArrr)linesssssss.ToIplImage(); Cv.HoughLines2(l2,...

标签: c# c++ opencv image-processing opencvsharp


【解决方案1】:

基于 Github 的 sample code for HoughLinesP

    static void Main(string[] args)
    {
        string filename = "Alliance.jpg";

        Mat imageIn = Cv2.ImRead(filename, ImreadModes.GrayScale).Resize(new Size(800, 600));
        Mat edges = new Mat();

        Cv2.Canny(imageIn, edges, 95, 100);

        //HoughLinesP
        LineSegmentPoint[] segHoughP = Cv2.HoughLinesP(edges, 1, Math.PI / 180, 100, 100, 10);
        
        Mat imageOutP = imageIn.EmptyClone();

        foreach (LineSegmentPoint s in segHoughP)
            imageOutP.Line(s.P1, s.P2, Scalar.White, 1, LineTypes.AntiAlias, 0);

        using (new Window("Edges", WindowMode.AutoSize, edges))
        using (new Window("HoughLinesP", WindowMode.AutoSize, imageOutP))
        {
            Window.WaitKey(0);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2013-03-28
    相关资源
    最近更新 更多