📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】
📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉
📢:内容若有错误,敬请留言 📝指正!原创文,转载请注明出处
1.轮廓检测
分为四个流程:
(1)输入图像转为灰度图像cvtColor
(2)使用Canny进行边缘提取,得到二值图像
(3)使用findContours寻找轮廓
(4)使用drawContours绘制轮廓
2.部分代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main() {
Mat src, Gau_src, gray_src, binary_src;
src = imread("D:/images/hand.jpg");
if (src.empty()) {
cout << "Could not load the image ...." << endl;
return -1;
}
imshow("input_image", src);
GaussianBlur(src, Gau_src, Size(3, 3), 0, 0,4);
cvtColor(Gau_src, gray_src, COLOR_BGR2GRAY);
threshold(gray_src, binary_src, 80, 255,THRESH_BINARY);
imshow(" binary_src", binary_src);
vector<vector<Point>>contours;
findContours(binary_src, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());
for (int t = 0; t < contours.size(); t++) {
drawContours(src, contours, t, Scalar(0, 0, 255), 1, 8);
double a = contourArea(contours[t]);
cout << "第" << t << "轮廓面积" << a<<endl;
}
imshow("Circle_image", src);
waitKey(0);
return 0;
}
3.全部代码
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
Mat src, dst;
const char* input_win = "【输入图像】";
const char* output_win = "【输出图像】";
int threshold_value = 100;
int threshold_max = 255;
RNG rng;
void Demo_Contours(int, void*);
int main()
{
src = imread("D:/images/lena.png");
if (!src.data)
{
cout << "could not load image !";
return -1;
}
namedWindow(input_win, WINDOW_AUTOSIZE);
namedWindow(output_win, WINDOW_AUTOSIZE);
imshow(input_win, src);
cvtColor(src, src, COLOR_BGR2GRAY);
//创建滑动条
const char* trackbar_title = "Threshold Value:";
createTrackbar(trackbar_title, output_win, &threshold_value, threshold_max, Demo_Contours);
Demo_Contours(0, 0);
waitKey(0);
return 0;
}
void Demo_Contours(int, void*) {
Mat canny_output;
vector<vector<Point>> contours;
vector<Vec4i> hierachy;
Canny(src, canny_output, threshold_value, threshold_value * 2, 3, false);
findContours(canny_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
dst = Mat::zeros(src.size(), CV_8UC3);
RNG rng(12345);
for (size_t i = 0; i < contours.size(); i++) {
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
drawContours(dst, contours, i, color, 2, 8, hierachy, 0, Point(0, 0));
}
imshow(output_win, dst);
}