opencv 最大內接矩形筆記
#include<opencv2\opencv.hpp>
#include <iostream>
#include<vector>
using namespace cv;
using namespace std;
/**
* @brief expandEdge 擴充套件邊界函式
* @param img: 輸入影像,單通道二值圖,深度為 8
* @param edge 邊界陣列,存放 4 條邊界值
* @param edgeID 當前邊界號
* @return 布林值 確定當前邊界是否可以擴充套件
*/
bool expandEdge(const Mat & img, int edge[], const int edgeID)
{
//[1] -- 初始化引數
int nc = img.cols;
int nr = img.rows;
switch (edgeID) {
case 0:
if (edge[0]>nr)
return false;
for (int i = edge[3]; i <= edge[1]; ++i)
{
if (img.at<uchar>(edge[0], i) == 255)// 遇見 255 畫素表明碰到邊緣線
return false;
}
edge[0]++;
return true;
break;
case 1:
if (edge[1]>nc)
return false;
for (int i = edge[2]; i <= edge[0]; ++i)
{
if (img.at<uchar>(i, edge[1]) == 255)// 遇見 255 畫素表明碰到邊緣線
return false;
}
edge[1]++;
return true;
break;
case 2:
if (edge[2]<0)
return false;
for (int i = edge[3]; i <= edge[1]; ++i)
{
if (img.at<uchar>(edge[2], i) == 255)// 遇見 255 畫素表明碰到邊緣線
return false;
}
edge[2]--;
return true;
break;
case 3:
if (edge[3]<0)
return false;
for (int i = edge[2]; i <= edge[0]; ++i)
{
if (img.at<uchar>(i, edge[3]) == 255)// 遇見 255 畫素表明碰到邊緣線
return false;
}
edge[3]--;
return true;
break;
default:
return false;
break;
}
}
/**
* @brief 求取連通區域內接矩
* @param img: 輸入影像,單通道二值圖,深度為 8
* @param center: 最小外接矩的中心
* @return 最大內接矩形
* 基於中心擴充套件演算法
*/
cv::Rect InSquare(Mat &img, const Point center)
{
// --[1] 引數檢測
if (img.empty() ||img.channels()>1|| img.depth()>8)
return Rect();
// --[2] 初始化變數
int edge[4];
edge[0] = center.y + 1;//top
edge[1] = center.x + 1;//right
edge[2] = center.y - 1;//bottom
edge[3] = center.x - 1;//left
//[2]
// --[3] 邊界擴充套件 ( 中心擴散法 )
bool EXPAND[4] = { 1,1,1,1 };// 擴充套件標記位
int n = 0;
while (EXPAND[0] || EXPAND[1] || EXPAND[2] || EXPAND[3])
{
int edgeID = n % 4;
EXPAND[edgeID] = expandEdge(img, edge, edgeID);
n++;
}
//[3]
//qDebug() << edge[0] << edge[1] << edge[2] << edge[3];
Point tl = Point(edge[3], edge[0]);
Point br = Point(edge[1], edge[2]);
return Rect(tl, br);
}
int main()
{
bool isExistence = false;
float first_area = 0;
/// 載入源影像
Mat src;
src = imread("cen.bmp", 1);
//src =外匯跟單gendan5.com imread("C:\\Users\\Administrator\\Desktop\\ 測試圖片 \\xxx\\20190308152516.jpg",1);
//src = imread("C:\\Users\\Administrator\\Desktop\\ 測試圖片 \\xx\\20190308151912.jpg",1);
//src = imread("C:\\Users\\Administrator\\Desktop\\ 測試影像 \\2\\BfImg17(x-247 y--91 z--666)-(492,280).jpg",1);
cvtColor(src, src, CV_RGB2GRAY);
threshold(src, src, 100, 255, THRESH_BINARY);
Rect ccomp;
Point center(src.cols / 2, src.rows / 2);
//floodFill(src, center, Scalar(255, 255, 55), &ccomp, Scalar(20, 20, 20), Scalar(20, 20, 20));
if (src.empty())
{
cout << "fali" << endl;
}
//resize(src, src, cv::Size(496, 460), cv::INTER_LINEAR);
imshow("src", src);
Rect rr = InSquare(src, center);
rectangle(src, rr, Scalar(255), 1, 8);
imshow("src2", src);
waitKey(0);
getchar();
return 0;
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2840460/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 單調棧進階-接雨水-最大矩形
- opencv外接矩形矯正OpenCV
- 最大加權矩形
- 【ALGO】Leetcode 85.最大矩形GoLeetCode
- 直方圖中最大矩形直方圖
- opencv學習筆記(一)OpenCV筆記
- P1719 最大加權矩形
- HISTOGRA - 最大矩形面積(單調棧)
- 刷題40-最大矩形面積
- 【opencv學習筆記】001之opencv配置(win10+VS2015+OpenCV3.1.0)OpenCV筆記Win10
- OpenCV3影像處理筆記OpenCV筆記
- 84. 柱狀圖中最大的矩形
- canvas學習筆記-繪製矩形及路徑(一)Canvas筆記
- OpenCV 名稱空間學習筆記OpenCV筆記
- OpenCV學習筆記(4)——mixChannels函式OpenCV筆記函式
- OpenCV學習筆記(5)——normalize函式OpenCV筆記ORM函式
- LeetCode_84.柱狀圖中最大的矩形LeetCode
- OpenCV筆記(3)實現支援向量機(SVM)OpenCV筆記
- OpenCV學習筆記-Harris角點檢測OpenCV筆記
- 程式碼隨想錄演算法訓練營 | 42. 接雨水,84. 柱狀圖中最大的矩形演算法
- Golang學習筆記(十九):Channel初步接觸Golang筆記
- OpenCV影像處理學習筆記-Day1OpenCV筆記
- 【隨手筆記】OpenCV python+vscode環境搭建筆記OpenCVPythonVSCode
- 力扣LCR 039. 柱狀圖中最大的矩形力扣
- leetcode:求直方圖構成的矩形最大面積LeetCode直方圖
- OpenCV學習筆記(3)——Scalar資料型別理解OpenCV筆記資料型別
- 程式碼隨想錄演算法訓練營第55天 | 42. 接雨水 、84.柱狀圖中最大的矩形演算法
- python-opencv 影像捕捉多個不規則輪廓,與輪廓內接區域(圓/矩形)思路-持續更新編輯中(會附上詳細的思路解釋和圖片)PythonOpenCV
- opencv學習筆記(二)-- 載入、修改和儲存影像OpenCV筆記
- opencv學習筆記四十四:移動物件統計OpenCV筆記物件
- 軟考筆記-有向圖的鄰接矩陣筆記矩陣
- 網路流最大流、最小割學習筆記筆記
- CMake構建學習筆記13-opencv庫的構建筆記OpenCV
- python版opencv:如何用筆記本攝像頭拍照儲存PythonOpenCV筆記
- C++ opencv的圓轉矩形,極座標轉笛卡爾座標系C++OpenCV
- 【刷題筆記】LeetCode-53 最大子陣列和筆記LeetCode陣列
- JDBC mysql 相關內容筆記JDBCMySql筆記
- 達內課程學習筆記筆記