如何用OpenCV实现求最小外接正矩形?
- 内容介绍
- 文章标签
- 相关推荐
本文共计796个文字,预计阅读时间需要4分钟。
本文实例展示了如何使用OpenCV实现最小外接正方形的代码。以下是大致内容:
pythonimport cv2import numpy as np
def min_enclosing_square(points): # 将点集转换为NumPy数组 points=np.array(points, dtype=np.float32)
# 计算点的质心 center=np.mean(points, axis=0)
# 计算点到质心的向量 vectors=points - center
# 计算向量的长度 lengths=np.linalg.norm(vectors, axis=1)
# 找到最长的向量 max_length_index=np.argmax(lengths) max_vector=vectors[max_length_index]
# 计算正方形的边长 side_length=2 * np.linalg.norm(max_vector)
# 计算正方形的四个顶点 points_sorted=np.sort(points, axis=0) p1=points_sorted[0] p2=points_sorted[1] p3=points_sorted[2] p4=points_sorted[3]
# 计算正方形的四个顶点相对于质心的偏移量 offset1=p1 - center offset2=p2 - center offset3=p3 - center offset4=p4 - center
# 计算正方形的旋转角度 rotation_angle=np.arctan2(offset2[1] - offset1[1], offset2[0] - offset1[0])
# 计算旋转后的正方形顶点 p1_rotated=offset1 * np.cos(rotation_angle) - offset1 * np.sin(rotation_angle) p2_rotated=offset2 * np.cos(rotation_angle) - offset2 * np.sin(rotation_angle) p3_rotated=offset3 * np.cos(rotation_angle) - offset3 * np.sin(rotation_angle) p4_rotated=offset4 * np.cos(rotation_angle) - offset4 * np.sin(rotation_angle)
# 计算正方形顶点相对于质心的坐标 p1_final=p1_rotated + center p2_final=p2_rotated + center p3_final=p3_rotated + center p4_final=p4_rotated + center
return p1_final, p2_final, p3_final, p4_final
示例点集points=[(100, 100), (200, 100), (200, 200), (100, 200)]
获取最小外接正方形的顶点square_points=min_enclosing_square(points)
打印结果print(最小外接正方形的顶点坐标:)print(p1:, square_points[0])print(p2:, square_points[1])print(p3:, square_points[2])print(p4:, square_points[3])
请注意,这段代码是一个简化的示例,实际应用中可能需要考虑更多的边界情况和优化。
本文实例为大家分享了OpenCV实现最小外接正矩形的具体代码,供大家参考,具体内容如下
#include "stdafx.h" #include "cv.h" #include "highgui.h" #include "cxcore.h" #include "math.h" #include <iostream.h> int main(int argc, char* argv[]) { IplImage *src; IplImage *dst; IplImage *ROI; CvMemStorage* storage=cvCreateMemStorage(0); CvSeq* contour=0; src=cvLoadImage("I:\\test.jpg",0); cvNamedWindow("image0",1); cvShowImage("image0",src); int hei=src->height; int wid=src->width; uchar *data; data=(uchar*)src->imageData; int widstep=src->widthStep; int channel=src->nChannels; dst=cvCreateImage(cvSize(wid,hei),IPL_DEPTH_8U,3); ROI=cvCreateImage(cvSize(wid,hei),IPL_DEPTH_8U,3); for (int i=0;i<hei;i++) { for(int j=0;j<wid;j++) { if (data[i*widstep+j*channel]>120) { data[i*widstep+j*channel]=0; } else { data[i*widstep+j*channel]=255; } } } cvNamedWindow("image",0); cvShowImage("image",src); printf("图像的高为:%d,宽为:%d\n\n",hei,wid); cvCvtColor(src, dst, CV_GRAY2BGR);; cvFindContours(src,storage,&contour,sizeof(CvContour),CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE); for(;contour!=0;contour=contour->h_next) { double length =cvArcLength(contour); double area =fabs(cvContourArea(contour)); CvRect rect = cvBoundingRect(contour,1); cout<<"Length="<<length<<" Area="<<area<<endl; CvPoint p1; CvPoint p2; p1.x=rect.x; p1.y=rect.y; p2.x=rect.x+rect.width; p2.y=rect.y+rect.height; cout<<"p1=("<<p1.x<<","<<p1.y<<")"; cout<<"p2=("<<p2.x<<","<<p2.y<<")"<<endl; cvRectangle(dst,p1,p2,CV_RGB(255,0,0),1,8,0); } cvNamedWindow("dst",1); cvShowImage("dst",dst); cvWaitKey(0); return 0; }
原图:
二值化反色图:
最小正矩形图:
最小正矩形信息:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。
本文共计796个文字,预计阅读时间需要4分钟。
本文实例展示了如何使用OpenCV实现最小外接正方形的代码。以下是大致内容:
pythonimport cv2import numpy as np
def min_enclosing_square(points): # 将点集转换为NumPy数组 points=np.array(points, dtype=np.float32)
# 计算点的质心 center=np.mean(points, axis=0)
# 计算点到质心的向量 vectors=points - center
# 计算向量的长度 lengths=np.linalg.norm(vectors, axis=1)
# 找到最长的向量 max_length_index=np.argmax(lengths) max_vector=vectors[max_length_index]
# 计算正方形的边长 side_length=2 * np.linalg.norm(max_vector)
# 计算正方形的四个顶点 points_sorted=np.sort(points, axis=0) p1=points_sorted[0] p2=points_sorted[1] p3=points_sorted[2] p4=points_sorted[3]
# 计算正方形的四个顶点相对于质心的偏移量 offset1=p1 - center offset2=p2 - center offset3=p3 - center offset4=p4 - center
# 计算正方形的旋转角度 rotation_angle=np.arctan2(offset2[1] - offset1[1], offset2[0] - offset1[0])
# 计算旋转后的正方形顶点 p1_rotated=offset1 * np.cos(rotation_angle) - offset1 * np.sin(rotation_angle) p2_rotated=offset2 * np.cos(rotation_angle) - offset2 * np.sin(rotation_angle) p3_rotated=offset3 * np.cos(rotation_angle) - offset3 * np.sin(rotation_angle) p4_rotated=offset4 * np.cos(rotation_angle) - offset4 * np.sin(rotation_angle)
# 计算正方形顶点相对于质心的坐标 p1_final=p1_rotated + center p2_final=p2_rotated + center p3_final=p3_rotated + center p4_final=p4_rotated + center
return p1_final, p2_final, p3_final, p4_final
示例点集points=[(100, 100), (200, 100), (200, 200), (100, 200)]
获取最小外接正方形的顶点square_points=min_enclosing_square(points)
打印结果print(最小外接正方形的顶点坐标:)print(p1:, square_points[0])print(p2:, square_points[1])print(p3:, square_points[2])print(p4:, square_points[3])
请注意,这段代码是一个简化的示例,实际应用中可能需要考虑更多的边界情况和优化。
本文实例为大家分享了OpenCV实现最小外接正矩形的具体代码,供大家参考,具体内容如下
#include "stdafx.h" #include "cv.h" #include "highgui.h" #include "cxcore.h" #include "math.h" #include <iostream.h> int main(int argc, char* argv[]) { IplImage *src; IplImage *dst; IplImage *ROI; CvMemStorage* storage=cvCreateMemStorage(0); CvSeq* contour=0; src=cvLoadImage("I:\\test.jpg",0); cvNamedWindow("image0",1); cvShowImage("image0",src); int hei=src->height; int wid=src->width; uchar *data; data=(uchar*)src->imageData; int widstep=src->widthStep; int channel=src->nChannels; dst=cvCreateImage(cvSize(wid,hei),IPL_DEPTH_8U,3); ROI=cvCreateImage(cvSize(wid,hei),IPL_DEPTH_8U,3); for (int i=0;i<hei;i++) { for(int j=0;j<wid;j++) { if (data[i*widstep+j*channel]>120) { data[i*widstep+j*channel]=0; } else { data[i*widstep+j*channel]=255; } } } cvNamedWindow("image",0); cvShowImage("image",src); printf("图像的高为:%d,宽为:%d\n\n",hei,wid); cvCvtColor(src, dst, CV_GRAY2BGR);; cvFindContours(src,storage,&contour,sizeof(CvContour),CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE); for(;contour!=0;contour=contour->h_next) { double length =cvArcLength(contour); double area =fabs(cvContourArea(contour)); CvRect rect = cvBoundingRect(contour,1); cout<<"Length="<<length<<" Area="<<area<<endl; CvPoint p1; CvPoint p2; p1.x=rect.x; p1.y=rect.y; p2.x=rect.x+rect.width; p2.y=rect.y+rect.height; cout<<"p1=("<<p1.x<<","<<p1.y<<")"; cout<<"p2=("<<p2.x<<","<<p2.y<<")"<<endl; cvRectangle(dst,p1,p2,CV_RGB(255,0,0),1,8,0); } cvNamedWindow("dst",1); cvShowImage("dst",dst); cvWaitKey(0); return 0; }
原图:
二值化反色图:
最小正矩形图:
最小正矩形信息:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。

