1,查找轮廓findCounters()函数
opencv学习(二十三)寻找并绘制轮廓findCounters()/找出凸包convexHull()1,查找轮廓findCounters()函数2,绘制轮廓drawCounters()实例1查找轮廓实例2查找并绘制轮廓2,找凸包实例3,随机点找凸包实例(vector出错–①复制时注意变动的东西②for循环语句后面不要跟封号;)实例4,对图片轮廓找凸包(类似实例2,画出轮廓后在对其求凸包)
opencv学习(二十三)寻找并绘制轮廓findCounters()/找出凸包convexHull()1,查找轮廓findCounters()函数2,绘制轮廓drawCounters()实例1查找轮廓实例2查找并绘制轮廓2,找凸包实例3,随机点找凸包实例(vector出错–①复制时注意变动的东西②for循环语句后面不要跟封号;)实例4,对图片轮廓找凸包(类似实例2,画出轮廓后在对其求凸包)
opencv学习(二十三)寻找并绘制轮廓findCounters()/找出凸包convexHull()1,查找轮廓findCounters()函数2,绘制轮廓drawCounters()实例1查找轮廓实例2查找并绘制轮廓2,找凸包实例3,随机点找凸包实例(vector出错–①复制时注意变动的东西②for循环语句后面不要跟封号;)实例4,对图片轮廓找凸包(类似实例2,画出轮廓后在对其求凸包) 2,绘制轮廓drawCounters()
opencv学习(二十三)寻找并绘制轮廓findCounters()/找出凸包convexHull()1,查找轮廓findCounters()函数2,绘制轮廓drawCounters()实例1查找轮廓实例2查找并绘制轮廓2,找凸包实例3,随机点找凸包实例(vector出错–①复制时注意变动的东西②for循环语句后面不要跟封号;)实例4,对图片轮廓找凸包(类似实例2,画出轮廓后在对其求凸包)
opencv学习(二十三)寻找并绘制轮廓findCounters()/找出凸包convexHull()1,查找轮廓findCounters()函数2,绘制轮廓drawCounters()实例1查找轮廓实例2查找并绘制轮廓2,找凸包实例3,随机点找凸包实例(vector出错–①复制时注意变动的东西②for循环语句后面不要跟封号;)实例4,对图片轮廓找凸包(类似实例2,画出轮廓后在对其求凸包) 实例1查找轮廓
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
//【1】读图
Mat srcimg = imread("D://1.jpg", );
imshow("原始图", srcimg);
//【2】初始化结果图
Mat dstimg = Mat::zeros(srcimg.rows, srcimg.cols, CV_8UC3);
//【3】取阈值大于119的原图部分
srcimg = srcimg > ;
imshow("取阈值后", srcimg);
//【4】定义轮廓和层次结构
vector<vector<Point>>contours;
vector<Vec4i> hierarchy;
//【5】查找轮廓
findContours(srcimg, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
//【6】历遍所有顶层可以囊括,以随机颜色绘制出每个连接组件的颜色
int index = ;
for (;index>=;index=hierarchy[index][])
{
Scalar color(rand() & , rand() & , rand() & );//rand()&255用法
drawContours(dstimg, contours, index, color, FILLED, , hierarchy);
}
//【7】显示最后轮廓图
imshow("轮廓图", dstimg);
waitKey();
}
opencv学习(二十三)寻找并绘制轮廓findCounters()/找出凸包convexHull()1,查找轮廓findCounters()函数2,绘制轮廓drawCounters()实例1查找轮廓实例2查找并绘制轮廓2,找凸包实例3,随机点找凸包实例(vector出错–①复制时注意变动的东西②for循环语句后面不要跟封号;)实例4,对图片轮廓找凸包(类似实例2,画出轮廓后在对其求凸包) 实例2查找并绘制轮廓
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
//全局变量申明
Mat g_srcimg, g_grayimg;
int g_thresh = ;
int g_thresh_max = ;
RNG g_rng();
Mat g_cannyMat_output;
vector<vector<Point>> g_vContours;
vector<Vec4i>g_vHierarchy;
//全局函数申明
void on_ThreshChange(int, void*);
//主函数
int main()
{
//【1】读图处理
g_srcimg = imread("D://1.jpg", );
blur(g_srcimg, g_grayimg, Size(, ));
imshow("灰度模糊降噪图", g_grayimg);
//【2】创建滑动条
createTrackbar("canny阈值", "灰度模糊降噪图", &g_thresh, g_thresh_max, on_ThreshChange);
on_ThreshChange(, );
waitKey();
return();
}//【3】回调函数
void on_ThreshChange(int, void*)
{
//【4】边缘检测
Canny(g_grayimg, g_cannyMat_output, g_thresh, g_thresh * , );
//【5】查找轮廓
findContours(g_cannyMat_output, g_vContours, g_vHierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(, ));
//【6】绘制轮廓
Mat drawing = Mat::zeros(g_cannyMat_output.size(), CV_8UC3);
int i = ;
for (; i <g_vContours.size(); i++)
{
Scalar color(g_rng.uniform(, ), g_rng.uniform(, ), g_rng.uniform(, ));// g_rng.uniform(0, 255))用法?
drawContours(drawing, g_vContours, i, color, , , g_vHierarchy, , Point());
}
//【7】显示最后轮廓图
imshow("轮廓图", drawing);
}
opencv学习(二十三)寻找并绘制轮廓findCounters()/找出凸包convexHull()1,查找轮廓findCounters()函数2,绘制轮廓drawCounters()实例1查找轮廓实例2查找并绘制轮廓2,找凸包实例3,随机点找凸包实例(vector出错–①复制时注意变动的东西②for循环语句后面不要跟封号;)实例4,对图片轮廓找凸包(类似实例2,画出轮廓后在对其求凸包) 2,找凸包
opencv学习(二十三)寻找并绘制轮廓findCounters()/找出凸包convexHull()1,查找轮廓findCounters()函数2,绘制轮廓drawCounters()实例1查找轮廓实例2查找并绘制轮廓2,找凸包实例3,随机点找凸包实例(vector出错–①复制时注意变动的东西②for循环语句后面不要跟封号;)实例4,对图片轮廓找凸包(类似实例2,画出轮廓后在对其求凸包)
opencv学习(二十三)寻找并绘制轮廓findCounters()/找出凸包convexHull()1,查找轮廓findCounters()函数2,绘制轮廓drawCounters()实例1查找轮廓实例2查找并绘制轮廓2,找凸包实例3,随机点找凸包实例(vector出错–①复制时注意变动的东西②for循环语句后面不要跟封号;)实例4,对图片轮廓找凸包(类似实例2,画出轮廓后在对其求凸包) 实例3,随机点找凸包实例(vector出错–①复制时注意变动的东西②for循环语句后面不要跟封号;)
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
//初始化变量和随机值
Mat image(, , CV_8UC3);
RNG&rng = theRNG();
//循环
while ()
{
char key;//键值
int count = (unsigned)rng % + ;//随机生成点数量
vector<Point> points;//点值
//随机生成坐标
for (int i = ; i < count; i++)
{
Point point;
point.x = rng.uniform(image.cols / , image.cols * / );
point.y = rng.uniform(image.rows / , image.rows * / );//注意X,y分别赋值
points.push_back(point);
}
//检测凸包
vector<int>hull;
convexHull(Mat(points), hull, true);
//绘制出随机颜色点
image = Scalar::all();
for (int i = ; i < count; i++)//for后面不需要分号
{
circle(image, points[i], , Scalar(rng.uniform(, ), rng.uniform(, ), rng.uniform(, )), FILLED, LINE_AA);
}
//准备参数
int hullcount = (int)hull.size();
Point point0 = points[hull[hullcount - ]];//连接凸包边的坐标点
//绘凸包的边
for (int i = ; i < hullcount; i++)
{
Point point = points[hull[i]];
line(image, point0, point, Scalar(, , ), , LINE_AA);
point0 = point;
}
imshow("凸包检测实例", image);
//按下ESC或q退出
key = (char)waitKey();
if (key == || key == 'q' || key == 'Q')
break;
}
return ;
}
opencv学习(二十三)寻找并绘制轮廓findCounters()/找出凸包convexHull()1,查找轮廓findCounters()函数2,绘制轮廓drawCounters()实例1查找轮廓实例2查找并绘制轮廓2,找凸包实例3,随机点找凸包实例(vector出错–①复制时注意变动的东西②for循环语句后面不要跟封号;)实例4,对图片轮廓找凸包(类似实例2,画出轮廓后在对其求凸包)
opencv学习(二十三)寻找并绘制轮廓findCounters()/找出凸包convexHull()1,查找轮廓findCounters()函数2,绘制轮廓drawCounters()实例1查找轮廓实例2查找并绘制轮廓2,找凸包实例3,随机点找凸包实例(vector出错–①复制时注意变动的东西②for循环语句后面不要跟封号;)实例4,对图片轮廓找凸包(类似实例2,画出轮廓后在对其求凸包) 实例4,对图片轮廓找凸包(类似实例2,画出轮廓后在对其求凸包)