2012-07-11 252 views
3

enter image description here如何檢測opencv或emgu cv中的三角形邊緣?

我使用Emgu CV,我想檢測兩個銳利的畫面,我首先轉換爲灰度圖像,並調用cvCanny,然後調用FindContours,但只找到了一個輪廓,三角形沒有找到。

代碼:

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()); 
      } 
     } 
    } 

回答

6

(我不知道emguCV,但我會給你的想法)

如下你可以這樣做:

  1. 斯普利特圖像R,G,B平面使用split()功能。
  2. 對於每個平面,應用Canny邊緣檢測。
  3. 然後找到其中的輪廓,並使用approxPolyDP函數近似每個輪廓。
  4. 如果近似輪廓中的座標數量爲3,則很可能是三角形,並且這些值對應於三角形的3個頂點。

下面是Python代碼:

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() 

下面是藍色色彩平面的精明圖:

enter image description here

下面是最終輸出,三角形和其vetices被標記在綠色和藍色:

enter image description here

+1

我們爲什麼需要分成3個頻道?那麼在彩色圖像之後,Canny會不會很好地工作?或轉換爲灰色? – Mikos 2012-08-09 16:24:02

+0

沒有必要吐。你可以轉換成灰度級並使用Canny邊緣檢測器。 – Michael 2012-09-11 20:42:37