本文共 2397 字,大约阅读时间需要 7 分钟。
#include#include #include using namespace cv;using namespace std;Mat src, temp, dst, src_gray;int threshold_v = 170;int threshold_max = 255;char *output = "output image";RNG rng;void Contours_Callback(int, void*);int main() { // 加载图像 src = imread("E:\\vs2015\\opencvstudy\\29police.jpg"); if (!src.data) { cout << "could not load image!" << endl; return -1; } imshow("inputImage", src); // 转换为灰度图像 cvtColor(src, src_gray, CV_BGR2GRAY); // 模糊处理 blur(src_gray, src_gray, Size(3, 3), Point(-1, -1), BORDER_DEFAULT); // 创建跟踪条 namedWindow(output, CV_WINDOW_AUTOSIZE); createTrackbar("Size", output, &threshold_v, threshold_max, Contours_Callback); // 调用回调函数 Contours_Callback(0, 0); waitKey(0); return 0;}void Contours_Callback(int, void*) { Mat bin_image; vector contours; vector hierarchy; // 二值化处理 threshold(src_gray, bin_image, threshold_v, threshold_max, THRESH_BINARY); // 查找轮廓 findContours(bin_image, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(-1, -1)); // 轮廓分析 vector > contours_poly(contours.size()); vector ploy_rects(contours.size()); vector ccs(contours.size()); vector radius(contours.size()); vector minRects(contours.size()); vector myellipse(contours.size()); for (size_t i = 0; i < contours.size(); i++) { // 用近似法得到外接多边形 approxPolyDP(Mat(contours[i]), contours_poly[i], 3, true); // 获取多边形的外接矩形 ploy_rects[i] = boundingRect(contours_poly[i]); // 计算多边形的外接圆 minEnclosingCircle(contours_poly[i], ccs[i], radius[i]); // 计算椭圆 if (contours_poly[i].size() > 5) { myellipse[i] = fitEllipse(contours_poly[i]); minRects[i] = minAreaRect(contours_poly[i]); } } // 绘制结果 src.copyTo(dst); Point2f pts[4]; for (size_t t = 0; t < contours.size(); t++) { Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); ellipse(dst, myellipse[t], color, 2, 8); // 画外接矩形 minRects[t].points(pts); for (int r = 0; r < 4; r++) { line(dst, pts[r], pts[(r+1) % 4], color, 2, 8); } } imshow("result", dst);}
以上代码展示了一个使用 OpenCV 库实现的图像处理程序,该程序用于绘制图像中的轮廓。程序的主要步骤包括:
程序通过 OpenCV 的 findContours 函数查找轮廓,并使用 approxPolyDP 近似多边形、boundingRect 获取外接矩形、minEnclosingCircle 计算外接圆以及 fitEllipse 计算椭圆等功能进行分析。最终结果通过 imshow 函数显示。
转载地址:http://tmsfk.baihongyu.com/