# 3. 范围

#include <iostream>
#include <opencv2/opencv.hpp>
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;

bool ascendSort(vector<Point> a,vector<Point> b)
{
return contourArea(a) > contourArea(b);
}

int main(int argc, char **argv) {
Mat image(1600, 1600, CV_8UC3, Scalar(0, 0, 0));

// 画一个正方形
rectangle(image, Point(100, 100), Point(400, 400), Scalar(255, 255, 0), -1);

// 画一个三角形
Point trianglePoints[3] = {Point(500, 800), Point(250, 1300), Point(800, 1100)};
fillConvexPoly(image, trianglePoints, 3, Scalar(255, 255, 0));

// 画一个五边形
Point pentagonPoints[5];
for (int i = 0; i < 5; i++) {
pentagonPoints[i] = Point(600 + 200 * cos(2 * CV_PI * i / 5), 600 + 200 * sin(2 * CV_PI * i / 5));
}
fillConvexPoly(image, pentagonPoints, 5, Scalar(255, 255, 0));

// 画一个圆形
circle(image, Point(1200, 1200), 300, Scalar(255, 255, 0), -1);

Mat gray,thresh;
cvtColor(image, gray, cv::COLOR_BGR2GRAY);
threshold(gray,thresh,0,255,THRESH_BINARY | THRESH_OTSU);
imshow("thresh", thresh);

vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(thresh, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
sort(contours.begin(), contours.end(), ascendSort);//ascending sort

for (size_t i = 0; i< contours.size(); i++) {
double area = contourArea(contours[i]);
Rect rect = boundingRect(contours[i]);
RotatedRect rrt = minAreaRect(contours[i]);

double rectangularity = area / (rrt.size.width*rrt.size.height);

double extent = area / (rect.width*rect.height);

}

imshow("result", image);
waitKey(0);
return 0;
}


aspect_radio = 1.000000, rectangularity = 0.784830, extent = 0.780308
aspect_radio = 1.099800, rectangularity = 0.500556, extent = 0.407986
aspect_radio = 0.950262, rectangularity = 0.691453, extent = 0.686282
aspect_radio = 1.000000, rectangularity = 1.000000, extent = 0.993367


# 4. 极点

#include <iostream>
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;

bool ascendSort(vector<Point> a,vector<Point> b)
{
return contourArea(a) > contourArea(b);
}

int main(int argc, char **argv) {
imshow("src", src);

Mat gray,thresh;
cvtColor(src, gray, cv::COLOR_BGR2GRAY);

threshold(gray,thresh,0,255,THRESH_BINARY_INV | THRESH_OTSU);
imshow("thresh", thresh);

vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(thresh, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
sort(contours.begin(), contours.end(), ascendSort);//ascending sort
cout << "contours.size() = " << contours.size() << endl;

//计算轮廓极值点
Point left = *min_element(contours[0].begin(), contours[0].end(),
[](const Point& lhs, const Point& rhs) {
return lhs.x < rhs.x;
});
Point right = *max_element(contours[0].begin(), contours[0].end(),
[](const Point& lhs, const Point& rhs) {
return lhs.x < rhs.x;
});
Point top = *min_element(contours[0].begin(), contours[0].end(),
[](const Point& lhs, const Point& rhs) {
return lhs.y < rhs.y;
});
Point bottom = *max_element(contours[0].begin(), contours[0].end(),
[](const Point& lhs, const Point& rhs) {
return lhs.y < rhs.y;
});

circle(src,left,2,Scalar(255,0,0),8);
circle(src,right,2,Scalar(255,0,0),8);
circle(src,top,2,Scalar(255,0,0),8);
circle(src,bottom,2,Scalar(255,0,0),8);

int fontFace = FONT_HERSHEY_PLAIN;
double fontScale = 2;
int thickness = 6;

putText(src,"left",left,fontFace,fontScale,Scalar(255, 0, 0),thickness);
putText(src,"right",right,fontFace,fontScale,Scalar(255, 0, 0),thickness);
putText(src,"top",top,fontFace,fontScale,Scalar(255, 0, 0),thickness);
putText(src,"bottom",bottom,fontFace,fontScale,Scalar(255, 0, 0),thickness);

imshow("result", src);

waitKey(0);
return 0;
}


# 5. 方向

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;

bool ascendSort(vector<Point> a,vector<Point> b)
{
return contourArea(a) > contourArea(b);
}

int main(int argc, char **argv) {
imshow("src", src);

Mat gray,thresh;
cvtColor(src, gray, cv::COLOR_BGR2GRAY);

threshold(gray,thresh,0,255,THRESH_BINARY_INV | THRESH_OTSU);
imshow("thresh", thresh);

vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(thresh, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
sort(contours.begin(), contours.end(), ascendSort);//ascending sort

for (size_t i = 0; i< contours.size(); i++) {
double area = contourArea(contours[i]);

if (area < 1000) {
continue;
}

RotatedRect rrt = fitEllipse(contours[i]);
Point2f center = rrt.center;
float angle = rrt.angle;
ellipse(src,rrt, Scalar(0, 0, 255), 8, 8);

std::string text = "angle:" + to_string(angle);
int fontFace = FONT_HERSHEY_PLAIN;
double fontScale = 5;
int thickness = 8;
putText(src,text,center,fontFace,fontScale,Scalar(255, 0, 0),thickness);
}
imshow("result", src);

waitKey(0);
return 0;
}


# 8. 总结

• 序言：七十年代末，一起剥皮案震惊了整个滨河市，随后出现的几起案子，更是在滨河造成了极大的恐慌，老刑警刘岩，带你破解...
沈念sama阅读 156,630评论 4 359
• 序言：滨河连续发生了三起死亡事件，死亡现场离奇诡异，居然都是意外死亡，警方通过查阅死者的电脑和手机，发现死者居然都...
沈念sama阅读 66,405评论 1 289
• 文/潘晓璐 我一进店门，熙熙楼的掌柜王于贵愁眉苦脸地迎上来，“玉大人，你说我怎么就摊上这事。” “怎么了？”我有些...
开封第一讲书人阅读 106,382评论 0 237
• 文/不坏的土叔 我叫张陵，是天一观的道长。 经常有香客问我，道长，这世上最难降的妖魔是什么？ 我笑而不...
开封第一讲书人阅读 43,548评论 0 203
• 正文 为了忘掉前任，我火速办了婚礼，结果婚礼上，老公的妹妹穿的比我还像新娘。我一直安慰自己，他们只是感情好，可当我...
茶点故事阅读 51,853评论 3 285
• 文/花漫 我一把揭开白布。 她就那样静静地躺着，像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上，一...
开封第一讲书人阅读 40,276评论 1 209
• 那天，我揣着相机与录音，去河边找鬼。 笑死，一个胖子当着我的面吹牛，可吹牛的内容都是我干的。 我是一名探鬼主播，决...
沈念sama阅读 31,638评论 2 309
• 文/苍兰香墨 我猛地睁开眼，长吁一口气：“原来是场噩梦啊……” “哼！你这毒妇竟也来了？” 一声冷哼从身侧响起，我...
开封第一讲书人阅读 30,350评论 0 195
• 序言：老挝万荣一对情侣失踪，失踪者是张志新（化名）和其女友刘颖，没想到半个月后，有当地人在树林里发现了一具尸体，经...
沈念sama阅读 34,015评论 1 238
• 正文 独居荒郊野岭守林人离奇死亡，尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
茶点故事阅读 30,309评论 2 240
• 正文 我和宋清朗相恋三年，在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
茶点故事阅读 31,836评论 1 256
• 序言：一个原本活蹦乱跳的男人离奇死亡，死状恐怖，灵堂内的尸体忽然破棺而出，到底是诈尸还是另有隐情，我是刑警宁泽，带...
沈念sama阅读 28,206评论 2 251
• 正文 年R本政府宣布，位于F岛的核电站，受9级特大地震影响，放射性物质发生泄漏。R本人自食恶果不足惜，却给世界环境...
茶点故事阅读 32,767评论 3 231
• 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹，春花似锦、人声如沸。这庄子的主人今日做“春日...
开封第一讲书人阅读 25,972评论 0 8
• 文/苍兰香墨 我抬头看了看天上的太阳。三九已至，却和暖如春，着一层夹袄步出监牢的瞬间，已是汗流浃背。 一阵脚步声响...
开封第一讲书人阅读 26,715评论 0 192
• 我被黑心中介骗来泰国打工， 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留，地道东北人。 一个月前我还...
沈念sama阅读 35,319评论 2 269
• 正文 我出身青楼，却偏偏与公主长得像，于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子，可洞房花烛夜当晚...
茶点故事阅读 35,222评论 2 258

### 推荐阅读更多精彩内容

• 在该系列第十四篇文章中，介绍了很多轮廓的基础特征，包括面积、周长、质心、凸包等等，它们也都是轮廓的几何特征。本文主...
fengzhizi715阅读 73评论 0 1
• 查找和绘制轮廓 findContours 会找到 如果在空mat上绘制，先把mat的区域设置好，填充满黑色。 获得...
Zszen阅读 5,189评论 0 50
• 1.1什么是轮廓 cv2.findContours() 轮廓可以简单认为成连续的点（连着边界）连在一起的曲线，具有...
Zoe_C阅读 6,693评论 1 8
• 矩(moment) 是概率与统计中的一个概念，是随机变量的一种数字特征，是对变量分布和形态特点的一组度量。 矩的定...
fengzhizi715阅读 59评论 0 1
• Ps入门基础 打开文件：Ctrl + O 放大：Ctrl + + 缩小：Ctrl + - 关闭当前图像：Ctrl ...
智识侠阅读 525评论 0 5