user1516381
user1516381

Reputation: 55

How to detect triangle edge in opencv or emgu cv?

enter image description here

I am using Emgu CV, i want to detect two sharp in the picture, first i convert the image to gray,and call cvCanny, then call FindContours, but just one contour found, the triangle not found.

Code:

 public static void Do(Bitmap bitmap, IImageProcessingLog log)
    {
        Image<Bgr, Byte> img = new Image<Bgr, byte>(bitmap);
        Image<Gray, Byte> gray = img.Convert<Gray, Byte>();
        using (Image<Gray, Byte> canny = new Image<Gray, byte>(gray.Size))
        using (MemStorage stor = new MemStorage())
        {
            CvInvoke.cvCanny(gray, canny, 10, 5, 3);
            log.AddImage("canny",canny.ToBitmap());

            Contour<Point> contours = canny.FindContours(
             Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,
             Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_TREE,
             stor);

            for (int i=0; contours != null; contours = contours.HNext)
            {
                i++;
                MCvBox2D box = contours.GetMinAreaRect();

                Image<Bgr, Byte> tmpImg = img.Copy();
                tmpImg.Draw(box, new Bgr(Color.Red), 2);
                log.AddMessage("contours" + (i) +",angle:"+box.angle.ToString() + ",width:"+box.size.Width + ",height:"+box.size.Height);
                log.AddImage("contours" + i, tmpImg.ToBitmap());
            }
        }
    }

Upvotes: 3

Views: 9192

Answers (1)

Abid Rahman K
Abid Rahman K

Reputation: 52646

(I don't know emguCV, but i will give you the idea)

You can do it as follows:

  1. Split the image to R,G,B planes using split() function.
  2. For each plane, apply Canny edge detection.
  3. Then find the contours in it and approximate each contour using approxPolyDP function.
  4. if number of coordinates in the approximated contour is 3, it is most likely a triangle and the values corresponds to 3 vertices of triangles.

Below is the python code :

import numpy as np
import cv2

img = cv2.imread('softri.png')

for gray in cv2.split(img):
    canny = cv2.Canny(gray,50,200)

    contours,hier = cv2.findContours(canny,1,2)
    for cnt in contours:
        approx = cv2.approxPolyDP(cnt,0.02*cv2.arcLength(cnt,True),True)
        if len(approx)==3:
            cv2.drawContours(img,[cnt],0,(0,255,0),2)
            tri = approx

for vertex in tri:
    cv2.circle(img,(vertex[0][0],vertex[0][1]),5,255,-1)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Below is canny diagram of blue color plane:

enter image description here

Below is the final output, triangle and its vetices are marked in green and blue colors respectively:

enter image description here

Upvotes: 6

Related Questions