如何在OpenCV 3.4.1中为boxContours添加points[4]以调用drawContours
解决OpenCV中RotatedRect顶点添加到轮廓容器的问题
首先,我得帮你理清问题核心:你通过cv::minAreaRect得到了旋转矩形,但它的顶点没法直接加入boxContours——因为drawContours要求轮廓必须是vector<vector<cv::Point>>类型的结构,而RotatedRect的顶点需要先转换成这个格式才行。
下面是修改后的完整代码片段,我会标注关键的新增步骤:
// 先定义boxContours,它是存储每个矩形轮廓的容器,类型必须匹配drawContours的要求 std::vector<std::vector<cv::Point>> boxContours; cv::findContours( gray, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); NSLog(@"contour size %lu",contours.size()); for (int i = 0; i< contours.size(); i++) { // 补全minAreaRect的参数,传入当前遍历的单个轮廓 cv::RotatedRect rect = cv::minAreaRect(contours[i]); // 关键步骤1:从RotatedRect中提取四个顶点,存入浮点型坐标数组 cv::Point2f pts[4]; rect.points(pts); // OpenCV3.x中RotatedRect的内置方法,直接获取顶点 // 关键步骤2:将浮点型坐标转换为整数型Point,存入单个矩形的轮廓vector std::vector<cv::Point> boxPoints; for (int j = 0; j < 4; j++) { // 用cvRound确保坐标为整数,符合drawContours的输入要求 boxPoints.push_back(cv::Point(cvRound(pts[j].x), cvRound(pts[j].y))); } // 关键步骤3:把这个矩形轮廓添加到boxContours容器中 boxContours.push_back(boxPoints); } // 现在可以正常将boxContours传入drawContours函数了 // 示例:在目标图像上绘制所有矩形轮廓,绿色,线宽2 cv::drawContours(your_target_image, boxContours, -1, cv::Scalar(0,255,0), 2);
几个需要注意的细节:
- 顶点类型转换:
minAreaRect返回的顶点是cv::Point2f(浮点型),而drawContours要求的轮廓点是cv::Point(整数型),必须用cvRound()做转换,否则会出现绘制异常。 - 容器类型匹配:
boxContours必须是vector<vector<cv::Point>>,每个子vector对应一个矩形的四个顶点,这样才能被drawContours正确识别为多个独立轮廓。 - 版本兼容性:你使用的OpenCV3.4.1完全支持
rect.points()方法,也可以用全局函数cv::boxPoints(rect, pts)提取顶点,效果完全一致。
内容的提问来源于stack exchange,提问作者santhoshkumar
相关产品推荐
相关产品推荐

