opencv 轮廓的长度,面积,外接矩形(平行坐标轴),处接最小矩形,处接圆 , 椭圆

本文介绍了一个使用OpenCV进行图像处理的示例程序,该程序能够从灰度图像中找到轮廓,并计算轮廓的长度和面积等属性。此外,还展示了如何绘制轮廓、外接矩形、最小外接圆、拟合椭圆及最小外接矩形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. #include <cv.h>  
  2. #include <cxcore.h>  
  3. #include <highgui.h>  
  4. #include <iostream>  
  5. using namespace std;  
  6.   
  7. int main()  
  8. {  
  9.     IplImage *src = cvLoadImage("f:\\images\\test2.bmp",CV_LOAD_IMAGE_GRAYSCALE);  
  10.     CvMemStorage *storage = cvCreateMemStorage();  
  11.     CvSeq *seq = NULL;  
  12.     int cnt = cvFindContours(src,storage,&seq);  
  13.     seq = seq->h_next;  
  14.     double length = cvArcLength(seq);  
  15.     double area = cvContourArea(seq);  
  16.     CvRect rect = cvBoundingRect(seq,1);  
  17.     CvBox2D box = cvMinAreaRect2(seq,NULL);  
  18.       
  19.     cout<<"Length = "<<length<<endl;  
  20.     cout<<"Area = "<<area<<endl;  
  21.       
  22.     IplImage *dst = cvCreateImage(cvGetSize(src),8,3); cvZero(dst);  
  23.     cvDrawContours(dst,seq,CV_RGB(255,0,0),CV_RGB(255,0,0),0);  
  24.     cvRectangleR(dst,rect,CV_RGB(0,255,0));  
  25.     cvShowImage("dst",dst);  
  26.     cvWaitKey();  
  27.   
  28.     CvPoint2D32f center;  
  29.     float radius;  
  30.     cvMinEnclosingCircle(seq,¢er,&radius);  
  31.     cvCircle(dst,cvPointFrom32f(center),cvRound(radius),CV_RGB(100,100,100));  
  32.     cvShowImage("dst",dst);  
  33.     cvWaitKey();  
  34.   
  35.     CvBox2D ellipse = cvFitEllipse2(seq);  
  36.     cvEllipseBox(dst,ellipse,CV_RGB(255,255,0));  
  37.     cvShowImage("dst",dst);  
  38.     cvWaitKey();  
  39.   
  40.     //绘制外接最小矩形  
  41.     CvPoint2D32f pt[4];  
  42.     cvBoxPoints(box,pt);  
  43.     for(int i = 0;i<4;++i){  
  44.         cvLine(dst,cvPointFrom32f(pt[i]),cvPointFrom32f(pt[((i+1)%4)?(i+1):0]),CV_RGB(0,0,255));  
  45.     }  
  46.     cvShowImage("dst",dst);  
  47.     cvWaitKey();  
  48.   
  49.     cvReleaseImage(&src);  
  50.     cvReleaseImage(&dst);  
  51.     cvReleaseMemStorage(&storage);    
  52. }  

输入图像 为bmp格式(自己用纯黑画的,已经是二值了), 如果用我下面的图片直接另存为,则就先载入图像,然后灰度化,再二值化



结果:




网址:http://blog.youkuaiyun.com/fdl19881/article/details/6730112

### 如何使用 OpenCV 计算椭圆外接矩形OpenCV 中,可以通过 `cv2.fitEllipse` 函数拟合一个椭圆到一组点上,并返回该椭圆的相关参数。为了获取这个椭圆外接矩形,可以利用这些参数进一步计算其边界框。 以下是具体实现方法: #### 1. 拟合椭圆并提取参数 函数 `cv2.fitEllipse(points)` 可以用于拟合椭圆,其中输入是一个二维点集数组。它会返回一个元组 `(center, axes, angle)`,分别表示椭圆中心坐标、轴长度以及旋转角度[^1]。 ```python import numpy as np import cv2 # 假设 points 是一组轮廓点 points = np.array([[x1, y1], [x2, y2], ...]) # 替换为实际数据 ellipse = cv2.fitEllipse(points) (center, (width, height), angle) = ellipse ``` #### 2. 构造外接矩形 一旦得到了椭圆的信息,就可以通过构造一个围绕它的最小面积矩形来获得外接矩形。这一步可以直调用 `cv2.boundingRect()` 或者更精确地使用 `cv2.minAreaRect()` 来得到旋转后的矩形。 对于非旋转版本(直角矩形),可采用以下代码: ```python rect = cv2.boundingRect(np.int32([points])) (x, y, w, h) = rect print(f"Bounding Rectangle: Top-left corner ({x}, {y}), Width={w}, Height={h}") ``` 如果需要考虑旋转情况,则应改用 `cv2.minAreaRect()` 方法: ```python rotated_rect = cv2.minAreaRect(points) box_points = cv2.boxPoints(rotated_rect) box_points = np.int0(box_points) print("Rotated Bounding Box Points:", box_points) ``` 上述两部分结合起来能够满足不同场景下对外接矩形的需求。 #### 完整示例代码 下面提供了一个完整的例子展示如何从给定的一系列点出发找到它们所形成形状的最佳匹配椭圆及其对应的外接矩形。 ```python import cv2 import numpy as np def draw_ellipse_and_bounding_box(image_path): img = cv2.imread(image_path, 0) _, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2:] if not contours: print("No contours detected.") return None cnt = max(contours, key=cv2.contourArea) ellipse = cv2.fitEllipse(cnt) center, axes, angle = ellipse result_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) cv2.ellipse(result_img, ellipse, (0, 255, 0), 2) # Draw fitted ellipse rotated_rect = cv2.minAreaRect(cnt) box_points = cv2.boxPoints(rotated_rect) box_points = np.int0(box_points) cv2.drawContours(result_img,[box_points],0,(255,0,0),2) # Draw min area rectangle straight_rect = cv2.boundingRect(cnt) x,y,w,h = straight_rect cv2.rectangle(result_img,(x,y),(x+w,y+h),(0,0,255),2) # Draw bounding rectangle return result_img result = draw_ellipse_and_bounding_box('your_image.png') if result is not None: cv2.imshow('Result', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 此脚本读入一幅灰度图,在二值化之后查找最大连通域作为目标对象,着绘制出相应的椭圆与两种类型的包围盒。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值