1. 程式人生 > 程式設計 >使用OpenCV檢測影象中的矩形

使用OpenCV檢測影象中的矩形

本文例項為大家分享了OpenCV檢測影象中矩形的具體程式碼,供大家參考,具體內容如下

前言

1.OpenCV沒有內建的矩形檢測的函式,如果想檢測矩形,要自己去實現。
2.我這裡使用的OpenCV版本是3.30.

矩形檢測

1.得到原始影象之後,程式碼處理的步驟是:

(1)濾波增強邊緣。
(2)分離影象通道,並檢測邊緣。
(3) 提取輪廓。
(4)使用影象輪廓點進行多邊形擬合。
(5)計算輪廓面積並得到矩形4個頂點。
(6)求輪廓邊緣之間角度的最大餘弦。
(7)畫出矩形。

2.程式碼

//檢測矩形
//第一個引數是傳入的原始影象,第二是輸出的影象。
void findSquares(const Mat& image,Mat &out)
{
 int thresh = 50,N = 5;
 vector<vector<Point> > squares;
 squares.clear();

 Mat src,dst,gray_one,gray;

 src = image.clone();
 out = image.clone();
 gray_one = Mat(src.size(),CV_8U);
 //濾波增強邊緣檢測
 medianBlur(src,9);
 //bilateralFilter(src,25,25 * 2,35);

 vector<vector<Point> > contours;
 vector<Vec4i> hierarchy;

 //在影象的每個顏色通道中查詢矩形
 for (int c = 0; c < image.channels(); c++)
 {
 int ch[] = { c,0 };

 //通道分離
 mixChannels(&dst,1,&gray_one,ch,1);

 // 嘗試幾個閾值
 for (int l = 0; l < N; l++)
 {
  // 用canny()提取邊緣
  if (l == 0)
  {
  //檢測邊緣
  Canny(gray_one,gray,5,thresh,5);
  //膨脹
  dilate(gray,Mat(),Point(-1,-1));
  imshow("dilate",gray);
  }
  else
  {
  gray = gray_one >= (l + 1) * 255 / N;
  }

  // 輪廓查詢
  //findContours(gray,contours,RETR_CCOMP,CHAIN_APPROX_SIMPLE);
  findContours(gray,hierarchy,CHAIN_APPROX_SIMPLE);

  vector<Point> approx;
  
  // 檢測所找到的輪廓
  for (size_t i = 0; i < contours.size(); i++)
  {
  //使用影象輪廓點進行多邊形擬合
  approxPolyDP(Mat(contours[i]),approx,arcLength(Mat(contours[i]),true)*0.02,true);

  //計算輪廓面積後,得到矩形4個頂點
  if (approx.size() == 4 &&fabs(contourArea(Mat(approx))) > 1000 &&isContourConvex(Mat(approx)))
  {
   double maxCosine = 0;

   for (int j = 2; j < 5; j++)
   {
   // 求輪廓邊緣之間角度的最大餘弦
   double cosine = fabs(angle(approx[j % 4],approx[j - 2],approx[j - 1]));
   maxCosine = MAX(maxCosine,cosine);
   }

   if (maxCosine < 0.3)
   {
   squares.push_back(approx);
   }
  }
  }
 }
 }

 
 for (size_t i = 0; i < squares.size(); i++)
 {
 const Point* p = &squares[i][0];

 int n = (int)squares[i].size();
 if (p->x > 3 && p->y > 3)
 {
  polylines(out,&p,&n,true,Scalar(0,255,0),3,LINE_AA);
 }
 }
 imshow("dst",out);
}

static double angle(Point pt1,Point pt2,Point pt0)
{
 double dx1 = pt1.x - pt0.x;
 double dy1 = pt1.y - pt0.y;
 double dx2 = pt2.x - pt0.x;
 double dy2 = pt2.y - pt0.y;
 return (dx1*dx2 + dy1*dy2) / sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);
}

3.執行結果

使用OpenCV檢測影象中的矩形

使用OpenCV檢測影象中的矩形

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。