最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用OpenCV檢測(cè)圖像中的矩形

 更新時(shí)間:2020年07月21日 13:42:41   作者:知來(lái)者逆  
這篇文章主要為大家詳細(xì)介紹了使用OpenCV檢測(cè)圖像中的矩形,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了OpenCV檢測(cè)圖像中矩形的具體代碼,供大家參考,具體內(nèi)容如下

前言

1.OpenCV沒(méi)有內(nèi)置的矩形檢測(cè)的函數(shù),如果想檢測(cè)矩形,要自己去實(shí)現(xiàn)。
2.我這里使用的OpenCV版本是3.30.

矩形檢測(cè)

1.得到原始圖像之后,代碼處理的步驟是:

(1)濾波增強(qiáng)邊緣。
(2)分離圖像通道,并檢測(cè)邊緣。
(3) 提取輪廓。
(4)使用圖像輪廓點(diǎn)進(jìn)行多邊形擬合。
(5)計(jì)算輪廓面積并得到矩形4個(gè)頂點(diǎn)。
(6)求輪廓邊緣之間角度的最大余弦。
(7)畫(huà)出矩形。

2.代碼

//檢測(cè)矩形
//第一個(gè)參數(shù)是傳入的原始圖像,第二是輸出的圖像。
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);
 //濾波增強(qiáng)邊緣檢測(cè)
 medianBlur(src, dst, 9);
 //bilateralFilter(src, dst, 25, 25 * 2, 35);

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

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

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

 // 嘗試幾個(gè)閾值
 for (int l = 0; l < N; l++)
 {
  // 用canny()提取邊緣
  if (l == 0)
  {
  //檢測(cè)邊緣
  Canny(gray_one, gray, 5, thresh, 5);
  //膨脹
  dilate(gray, 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, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);

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

  //計(jì)算輪廓面積后,得到矩形4個(gè)頂點(diǎn)
  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, 1, 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.運(yùn)行結(jié)果

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++中為什么要使用動(dòng)態(tài)內(nèi)存

    C++中為什么要使用動(dòng)態(tài)內(nèi)存

    大家好,本篇文章主要講的是C++中為什么要使用動(dòng)態(tài)內(nèi)存,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • C++模板template用法小結(jié)(推薦)

    C++模板template用法小結(jié)(推薦)

    這篇文章主要介紹了C++模板template用法總結(jié) ,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C語(yǔ)言詳解UDP通信的實(shí)現(xiàn)

    C語(yǔ)言詳解UDP通信的實(shí)現(xiàn)

    UDP協(xié)議是用戶數(shù)據(jù)報(bào)協(xié)議,面向無(wú)連接的、不穩(wěn)定、不可靠、不安全的數(shù)據(jù)報(bào)傳遞---更像是是收發(fā)短信;UDP傳輸不需要建立連接,傳輸效率更高,在穩(wěn)定的局域網(wǎng)內(nèi)環(huán)境相對(duì)可靠;UDP天然支持多客戶端
    2022-05-05
  • C++實(shí)現(xiàn)LeetCode(111.二叉樹(shù)的最小深度)

    C++實(shí)現(xiàn)LeetCode(111.二叉樹(shù)的最小深度)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(111.二叉樹(shù)的最小深度),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++中用指向數(shù)組的指針作函數(shù)參數(shù)

    C++中用指向數(shù)組的指針作函數(shù)參數(shù)

    多維數(shù)組名作為函數(shù)參數(shù)傳遞:在二維數(shù)組中,數(shù)組名a是指向首行a[0]的指針,也就是說(shuō)a=&a[0]; a[0]是指向首元素a[0][0]的指針,也就是說(shuō)a[0]=&a[0][0]
    2013-10-10
  • FFmpeg進(jìn)階教程之給視頻添加文字水印

    FFmpeg進(jìn)階教程之給視頻添加文字水印

    FFmpeg是一套可以用來(lái)記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開(kāi)源計(jì)算機(jī)程序,下面這篇文章主要給大家介紹了關(guān)于FFmpeg進(jìn)階教程之給視頻添加文字水印的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • 淺談C++反向迭代器的設(shè)計(jì)

    淺談C++反向迭代器的設(shè)計(jì)

    本文主要介紹了淺談C++反向迭代器的設(shè)計(jì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C語(yǔ)言實(shí)現(xiàn)基于最大堆和最小堆的堆排序算法示例

    C語(yǔ)言實(shí)現(xiàn)基于最大堆和最小堆的堆排序算法示例

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)基于最大堆和最小堆的堆排序算法示例,分別是基于最大堆的升序排序和基于最小堆的降序排序?qū)嵗?需要的朋友可以參考下
    2016-06-06
  • 手把手教你用C語(yǔ)言實(shí)現(xiàn)三子棋

    手把手教你用C語(yǔ)言實(shí)現(xiàn)三子棋

    三子棋是黑白棋的一種。三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。這篇文章就教你如何用C語(yǔ)言實(shí)現(xiàn)三子棋的功能
    2021-08-08
  • C++實(shí)現(xiàn)學(xué)生檔案管理系統(tǒng)

    C++實(shí)現(xiàn)學(xué)生檔案管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)學(xué)生檔案管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評(píng)論

慈利县| 广安市| 林甸县| 钟山县| 马边| 锡林郭勒盟| 岫岩| 阿拉善右旗| 洞口县| 南澳县| 凤山县| 上高县| 阳信县| 罗源县| 萝北县| 姜堰市| 乌鲁木齐市| 兴和县| 凤庆县| 虞城县| 望都县| 灌阳县| 陈巴尔虎旗| 鄂伦春自治旗| 怀远县| 武邑县| 临邑县| 通化县| 英超| 蕲春县| 梁河县| 石城县| 宽城| 禹城市| 三台县| 潞城市| 依兰县| 尉犁县| 东乌珠穆沁旗| 贡觉县| 克东县|