opencv 最大内切矩形
- 格式:docx
- 大小:15.53 KB
- 文档页数:4
opencvsharp 多边形的最小内接矩形概述及解释说明1. 引言1.1 概述本文将介绍OpencvSharp中的多边形的最小内接矩形,并解释其实现方法和应用场景。
随着数字图像处理技术的不断发展,越来越多的应用需要对图像中的多边形进行分析和处理。
而多边形的最小内接矩形是一种重要的几何特征,它可以帮助我们更好地理解和描述图像中的各种物体。
1.2 文章结构本文分为五个部分:引言、OpencvSharp多边形的最小内接矩形、实现方法与示例说明、应用场景与案例分析以及结论与展望。
在引言部分,我们将对文章进行概述,并介绍文章结构。
在第二部分,我们将详细介绍OpencvSharp库以及多边形和内接矩形的概念解释。
然后,在第三部分,我们将讨论如何安装OpencvSharp库,并给出读取和绘制多边形图像数据以及计算多边形最小内接矩形的具体实现方法。
在第四部分,我们将通过实际案例来说明该技术在图像处理领域中的应用场景。
最后,在第五部分,我们将总结整篇文章并提出进一步研究的方向。
1.3 目的本文旨在提供一个关于OpencvSharp多边形最小内接矩形的全面概述和解释说明。
通过该文章,读者将了解到OpencvSharp库在多边形处理中的重要性,并能掌握计算多边形最小内接矩形的方法。
此外,本文还将介绍一些实际应用案例,帮助读者更好地理解该技术在图像处理领域中的实际应用价值。
最后,我们希望通过本文的阐述能够激发读者进一步研究和探索这一领域,并为未来的相关研究提供有益的借鉴。
2. OpencvSharp 多边形的最小内接矩形2.1 OpencvSharp 简介OpencvSharp是一个基于C#的开源计算机视觉库,它提供了丰富的图像处理和计算机视觉函数。
该库是对OpenCV库的封装,在.NET平台上提供了一种简单而强大的方式来进行图像处理和分析。
2.2 多边形和内接矩形的概念解释在数学和几何学中,多边形是由若干个连续直线段组成的封闭图形。
C#使⽤opencv截取旋转矩形区域图像的实现⽰例前⾔:最近在⼯程中需要⽤到截取RotatedRect中的图形,保存为Mat做后续处理。
发现opencv⽂档中没有这个api,最开始想到的⽅案是将整张图⽚进⾏相应的旋转,然后再从中截取正矩形,但是我们要获取的是部分区域,将整张图⽚进⾏旋转会造成很多的资源浪费。
所以需要⾃⾏实现⼀个旋转矩形的⽅案。
实现⽅法原理是利⽤向量空间变换,如图通过Point2f[] points=rotatedRect.Points();可获取RotatedRect四个端点的坐标。
先选定⼀个点为输出Mat左上端点,这⾥采取的是离原图左上⾓最近的端点(即x2+y2最⼩)。
然后再选取相邻的2个端点,作向量Vx及Vy。
这⾥可以根据需求来选定Vx和Vy的⽅向,⽐如要求输出Mat的Width⼤于Height,那就选定长的⼀边为Vx。
这⾥直接选定左上端点到顺时针⽅向的端点的向量为Vx,即如图所⽰。
在选定好Vx和Vy后,进⾏向量空间的变换。
设在输出的Mat中任⼀⼀个坐标点(i,j),对应在输出Mat中的任⼀坐标点(x,y)。
设左上端点坐标(x0,y0) (即图中点2),满⾜:设⽬标RotatedRect长宽为width height,有然后做⼀个⼆重循环,将j从0循环到height,i从0循环到width,就可以得到输出Mat所有像素的信息。
下⾯为⼀个截取BGR类型的Mat的RotatedRect的代码///<Summary>///利⽤向量运算截取⼀个RotatedRect区域///</Summary>///<param name="img">类型为CV_U8C3的Mat</param>///<param name="rotatedRect">RotatedRect</param>public static Mat sliceRotetedImg8UC3(Mat img,RotatedRect rotatedRect){// Rect bounding=rotatedRect.BoundingRect();Point2f[] points=rotatedRect.Points();int topLeftIndex=0;double topLeftR=points[0].X*points[0].X+points[0].Y*points[0].Y;for(int i=1;i<4;i++){double r=points[i].X*points[i].X+points[i].Y*points[i].Y;if(r<topLeftR){topLeftIndex=i;topLeftR=r;}}double x1=points[(topLeftIndex+1)%4].X-points[topLeftIndex].X,y1=points[(topLeftIndex+1)%4].Y-points[topLeftIndex].Y;double x2=points[(topLeftIndex+3)%4].X-points[topLeftIndex].X,y2=points[(topLeftIndex+3)%4].Y-points[topLeftIndex].Y;double vX1=x1,vY1=y1,vX2=x2,vY2=y2;int width=(int)Math.Sqrt(vX1*vX1+vY1*vY1),height=(int)Math.Sqrt(vX2*vX2+vY2*vY2);Mat ret=new Mat(new Size(width,height),MatType.CV_8UC3);// Console.WriteLine($"width={width},height={height}");var indexer1=img.GetGenericIndexer<Vec3b>();var indexer2=ret.GetGenericIndexer<Vec3b>();for(int j=0;j<ret.Height;j++){for(int i=0;i<ret.Width;i++){double kx=(double)i/width,ky=(double)j/height;int x=(int)(points[topLeftIndex].X+kx*vX1+ky*vX2),y=(int)(points[topLeftIndex].Y+kx*vY1+ky*vY2);indexer2[j,i]=indexer1[y,x];}}return ret;}到此这篇关于C#使⽤opencv截取旋转矩形区域图像的⽂章就介绍到这了,更多相关C# opencv截取内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
opencv3.0识别并提取图形中的矩形展开全文利用opencv来识别图片中的矩形。
其中遇到的问题主要是识别轮廓时矩形内部的形状导致轮廓不闭合。
1. 对输入灰度图片进行高斯滤波2. 做灰度直方图,提取阈值,做二值化处理3. 提取图片轮廓4. 识别图片中的矩形5. 提取图片中的矩形1.对输入灰度图片进行高斯滤波cv::Mat src = cv::imread('F:\\t13.bmp',CV_BGR2GRAY);cv::Mat hsv;GaussianBlur(src,hsv,cv::Size(5,5),0,0);2.做灰度直方图,提取阈值,做二值化处理由于给定图片,背景是黑色,矩形背景色为灰色,矩形中有些其他形状为白色,可以参考为:提取轮廓时,矩形外部轮廓并未闭合。
因此,我们需要对整幅图做灰度直方图,找到阈值,进行二值化处理。
即令像素值(黑色)小于阈值的,设置为0(纯黑色);令像素值(灰色和白色)大于阈值的,设置为255(白色)1.// Quantize the gray scale to 30 levels2.int gbins = 16;3.int histSize[] = {gbins};4.// gray scale varies from 0 to 2565.float granges[] = {0,256};6.const float* ranges[] = { granges };7.cv::MatND hist;8.// we compute the histogram from the 0-th and 1-st channels9.int channels[] = {0};10.11.//calculate hist12.calcHist( &hsv, 1, channels, cv::Mat(), // do not use ma sk13.hist, 1, histSize, ranges,14.true, // the histogram is uniform15.false );16.//find the max value of hist17.double maxVal=0;18.minMaxLoc(hist, 0, &maxVal, 0, 0);19.20.int scale = 20;21.cv::Mat histImg;22.histImg.create(500,gbins*scale,CV_8UC3);23.24.//show gray scale of hist image25.for(int g=0;g<gbins;g++){26.float binVal = hist.at<float>(g,0);27.int intensity = cvRound(binVal*255);28.rectangle( histImg, cv::Point(g*scale,0),29.cv::Point((g+1)*scale - 1,binVal/maxVal*400),30.CV_RGB(0,0,0),31.CV_FILLED );32.}33.cv::imshow('histImg',histImg);34.35.//threshold processing36.cv::Mat hsvRe;37.threshold( hsv, hsvRe, 64, 255,cv::THRESH_BINARY);3.提取图片轮廓为了识别图片中的矩形,在识别之前还需要提取图片的轮廓。
opencv 的rectangle参数OpenCV的rectangle函数是用于在图像上绘制矩形框的功能。
该函数有多个参数,包括图像、矩形框的左上角坐标、矩形框的右下角坐标、矩形框的颜色、线宽等。
下面将详细介绍这些参数及其功能。
我们来看一下rectangle函数的定义。
在OpenCV中,这个函数的原型如下:void rectangle(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness = 1, int lineType = 8, int shift = 0)其中,参数img是要绘制矩形框的图像,它是一个Mat类型的对象。
Point pt1和pt2是矩形框的左上角和右下角坐标,它们都是Point类型的对象。
const Scalar& color是矩形框的颜色,可以是一个RGB值或者是一个预定义的颜色名称,它是一个Scalar类型的对象。
int thickness是矩形框的线宽,它是一个整数值,默认为1。
int lineType是线的类型,它是一个整数值,默认为8。
int shift是坐标点的小数点位数,它是一个整数值,默认为0。
我们需要准备一张图像,用于绘制矩形框。
可以使用OpenCV的imread函数读取一张图片,然后将其赋值给一个Mat类型的对象。
接下来,我们可以调用rectangle函数来绘制矩形框。
在调用函数时,需要传入图像、矩形框的左上角和右下角坐标、矩形框的颜色、线宽等参数。
调用完函数后,矩形框就会被绘制在图像上。
需要注意的是,矩形框的左上角和右下角坐标是以像素为单位的。
坐标原点位于图像的左上角,x轴向右延伸,y轴向下延伸。
因此,左上角的坐标需要小于右下角的坐标,否则矩形框将无法正确绘制。
颜色参数可以是一个RGB值,例如Scalar(0, 255, 0)表示绿色。
也可以使用预定义的颜色名称,例如Scalar::all(255)表示白色。
OpenCV中Rect()函数常用操作和使用详解(含绘图示例)Rectangle()函数用法基本概念:Rect(int x, int y, int width, int height);参数含义:Rect(左上角x坐标,左上角y坐标,矩形的宽,矩形的高)例如我们画一个图Rect(20,50,30,40), 我用matlab画了一下,比较直观那对于Rect(20,50,30,40)有哪些常用的操作?rect.area(); //返回面积,1200rect.size();//返回尺寸,30x40rect.tl();// 返回左上角坐标(20,50)rect.br();//返回右下角坐标(50,10)rect.width();//返回宽度30rect.height();//返回高度40rect.contains(Point(x,y)) ; //返回布尔true/false, 判断x,y是否在这个矩形中交集、并集, 矩阵对比,很像C语言rect = rect1 & rect2;rect = rect1 | rect2;rect1 == rect2; //返回布尔值rect1 != rect2 ; //返回布尔值Rectangle用法void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color,int thickness=1, int line_type=8, int shift=0 );img:图像.pt1 :矩形的一个顶点。
pt2:矩形对角线上的另一个顶点color:线条颜色(RGB) 或亮度(灰度图像)(grayscale image)。
//后面这三个都是可有可没有的thickness:组成矩形的线条的粗细程度。
取负值时(如CV_FILLED)函数绘制填充了色彩的矩形。
line_type:线条的类型。
见cvLine的描述shift:坐标点的小数点位数。
pythonopencv找出图像中的最⼤轮廓并填充(⽣成mask)本⽂主要介绍了python opencv 找出图像中的最⼤轮廓并填充,分享给⼤家,具体如下:import cv2import numpy as npfrom PIL import Imagefrom joblib import Parallelfrom joblib import delayed# Parallel 和 delayed是为了使⽤多线程处理# 使⽤前需要安装joblib:pip install joblib# img_stack的shape为:num, h, w# 是三维的图像,可以理解为是num张⼆维的图像组成# mask是⽤来保存最后的结果的mask = np.ones_like(img_stack)for i in range(num):# 阈值化_, binaryzation = cv2.threshold(img_stack[i], 5, 255, cv2.THRESH_BINARY_INV)# 找到所有的轮廓contours, _ = cv2.findContours(binaryzation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)area = []# 找到最⼤的轮廓for k in range(len(contours)):area.append(cv2.contourArea(contours[k]))max_idx = np.argmax(np.array(area))# cv2.fillContexPoly(mask[i], contours[max_idx], 0)# 填充最⼤的轮廓cv2.drawContours(mask[i], contours, max_idx, 0, cv2.FILLED)del area# 保存def _write_mask(mask, i):Image.fromarray(mask.astype(np.uint8)*255).save(os.path.join(path, 'm%d.png' % i))# 使⽤多线程进⾏保存num_cores = 10parallel = Parallel(n_jobs=num_cores, backend='threading')parallel(delayed(_write_mask)(mask[i, :, :], i) for i in range(0, num))之前偷懒直接将项⽬⾥⾯的代码段扣下来放在这⾥,误导了⼤家,抱歉这次我重新放⼀个完整版本,希望对⼤家有所帮助~~代码在python 3.7.6 和opencv-python 4.3.0下测试成功import cv2import numpy as np# 以灰度⽅式读取图像img = cv2.imread('img.png', cv2.IMREAD_GRAYSCALE)mask = img.copy()# ⼆值化,100为阈值,⼩于100的变为255,⼤于100的变为0# 也可以根据⾃⼰的要求,改变参数:# cv2.THRESH_BINARY# cv2.THRESH_BINARY_INV# cv2.THRESH_TRUNC# cv2.THRESH_TOZERO_INV# cv2.THRESH_TOZERO_, binaryzation = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY_INV)# 找到所有的轮廓contours, _ = cv2.findContours(binaryzation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)area = []# 找到最⼤的轮廓for k in range(len(contours)):area.append(cv2.contourArea(contours[k]))max_idx = np.argmax(np.array(area))# 填充最⼤的轮廓mask = cv2.drawContours(mask, contours, max_idx, 0, cv2.FILLED)# 保存填充后的图像cv2.imwrite('masked.png', mask)输⼊图像:输出图像:到此这篇关于python opencv 找出图像中的最⼤轮廓并填充(⽣成mask)的⽂章就介绍到这了,更多相关opencv最⼤轮廓内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
opencv矩形度计算矩形度是指一个物体的外形与矩形的相似程度,是图像处理中常用的一个指标。
在计算机视觉领域中,矩形度可以用来检测物体的形状、大小和方向等信息,常用于目标检测、图像分割和物体识别等领域。
在OpenCV中,矩形度可以通过计算物体的轮廓面积与其外接矩形面积的比值来得到。
具体的计算方法如下:1. 读取图像并进行灰度化处理。
2. 对图像进行二值化处理,得到物体的轮廓。
3. 使用cv2.findContours()函数找到物体的轮廓。
4. 使用cv2.boundingRect()函数得到物体的外接矩形。
5. 计算物体的轮廓面积和外接矩形面积,并计算矩形度。
下面是一个简单的示例代码:```import cv2# 读取图像并进行灰度化处理img = cv2.imread('test.jpg')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 对图像进行二值化处理ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)# 找到物体的轮廓contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 得到物体的外接矩形x, y, w, h = cv2.boundingRect(contours[0])cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)# 计算物体的轮廓面积和外接矩形面积,并计算矩形度contour_area = cv2.contourArea(contours[0])rect_area = w * hrectangularity = contour_area / rect_area# 显示结果cv2.imshow('image', img)cv2.waitKey(0)cv2.destroyAllWindows()```在上面的代码中,我们首先读取了一张图像,并将其转换为灰度图像。
前言好长时间没写博文了,今天偷偷懒写篇关于opencv2中鼠标响应操作的文章。
鼠标操作属于用户接口设计,以前一直使用Qt来做,但是如果只需要简单的鼠标,键盘操作,直接调用opencv 库的函数也未尝不可,鼠标操作之前已经接触很多了,在MFC,QT,OpenGL,等等中,理论主要就是两点,一是监控鼠标操作,鼠标点击,移动,松开,然后通过mouse_event识别判断出那一种鼠标的操作,根据不同的操作然后进行处理,二是在主函数中加入鼠标的回调函数,将鼠标操作与程序的窗口绑定。
第一节函数介绍暂时只接触了两个关于opencv2鼠标响应操作的函数,下面分别介绍一下:1.1 回调函数opencv2.4.5中,提供的鼠标回调函数是setMouseCallback,函数声明如下:1CV_EXPORTS void setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata = 0);函数参数介绍const string& winname,windows视窗名称,对名为winname的视窗进行鼠标监控。
MouseCallback onMouse,鼠标响应处理函数,监听鼠标的点击,移动,松开,判断鼠标的操作类型,并进行响应的函数处理。
void* userdata = 0 鼠标响应处理函数的ID,与鼠标相应处理函数相匹配就行,暂时只用到默认为0的情况。
函数使用实例:2namedWindow("img");3setMouseCallback("img",on_mouse,0);1.2 鼠标响应处理函数opencv2.4.5中,鼠标相应处理函数一般默认形参和返回参数,函数形式如下:4void on_mouse(int event,int x,int y,int flags,void *ustc)函数参数介绍: int event,鼠标操作时间的整数代号,在opencv2.4.5中,event鼠标事件总共有10中,从0-9依次代表如下:Event:5#define CV_EVENT_MOUSEMOVE 0 滑动6#define CV_EVENT_LBUTTONDOWN 1 左键点击7#define CV_EVENT_RBUTTONDOWN 2 右键点击8#define CV_EVENT_MBUTTONDOWN 3 中间点击9#define CV_EVENT_LBUTTONUP 4 左键释放10#define CV_EVENT_RBUTTONUP 5 右键释放11#define CV_EVENT_MBUTTONUP 6 中间释放12#define CV_EVENT_LBUTTONDBLCLK 7 左键双击13#define CV_EVENT_RBUTTONDBLCLK 8 右键双击14#define CV_EVENT_MBUTTONDBLCLK 9 中间释放int x,int y,代表鼠标位于窗口的(x,y)坐标位置,窗口左上角默认为原点,向右为x轴,向下为y轴,int flags,代表鼠标的拖拽事件,以及键盘鼠标联合事件,总共有32种事件,依次如下:flags:15#define CV_EVENT_FLAG_LBUTTON 1 左键拖拽16#define CV_EVENT_FLAG_RBUTTON 2 右键拖拽17#define CV_EVENT_FLAG_MBUTTON 4 中间拖拽18#define CV_EVENT_FLAG_CTRLKEY 8 (8~15)按Ctrl不放事件19#define CV_EVENT_FLAG_SHIFTKEY 16 (16~31)按Shift不放事件20#define CV_EVENT_FLAG_ALTKEY 32 (32~39)按Alt不放事件(后面8-39还有待研究)void *ustc,函数参数的编号(暂时用不到)第二节鼠标操作实例2.1 示例程序代码程序如下,已经附上说明:21#include <opencv2/core/core.hpp>22#include <opencv2/highgui/highgui.hpp>23#include <stdio.h>2425using namespace cv;2627cv::Mat org,dst,img,tmp;28void on_mouse(int event,int x,int y,int flags,void *ustc)//event鼠标事件代号,x,y鼠标坐标,flags拖拽和键盘操作的代号29{30static Point pre_pt = (-1,-1);//初始坐标31static Point cur_pt = (-1,-1);//实时坐标32char temp[16];33if (event == CV_EVENT_LBUTTONDOWN)//左键按下,读取初始坐标,并在图像上该点处划圆34 {35 org.copyTo(img);//将原始图片复制到img中36 sprintf(temp,"(%d,%d)",x,y);37 pre_pt = Point(x,y);38 putText(img,temp,pre_pt,FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,0,255),1,8);//在窗口上显示坐标39 circle(img,pre_pt,2,Scalar(255,0,0,0),CV_FILLED,CV_AA,0);//划圆40 imshow("img",img);41 }42else if (event == CV_EVENT_MOUSEMOVE && !(flags & CV_EVENT_FLAG_LBUTTON))//左键没有按下的情况下鼠标移动的处理函数43 {44 img.copyTo(tmp);//将img复制到临时图像tmp上,用于显示实时坐标45 sprintf(temp,"(%d,%d)",x,y);46 cur_pt = Point(x,y);47 putText(tmp,temp,cur_pt,FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,0,255));//只是实时显示鼠标移动的坐标49 }50else if (event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))//左键按下时,鼠标移动,则在图像上划矩形51 {52 img.copyTo(tmp);53 sprintf(temp,"(%d,%d)",x,y);54 cur_pt = Point(x,y);55 putText(tmp,temp,cur_pt,FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,0,255));56 rectangle(tmp,pre_pt,cur_pt,Scalar(0,255,0,0),1,8,0);//在临时图像上实时显示鼠标拖动时形成的矩形57 imshow("img",tmp);58 }59else if (event == CV_EVENT_LBUTTONUP)//左键松开,将在图像上划矩形60 {61 org.copyTo(img);62 sprintf(temp,"(%d,%d)",x,y);63 cur_pt = Point(x,y);64 putText(img,temp,cur_pt,FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,0,255));65 circle(img,pre_pt,2,Scalar(255,0,0,0),CV_FILLED,CV_AA,0);66 rectangle(img,pre_pt,cur_pt,Scalar(0,255,0,0),1,8,0);//根据初始点和结束点,将矩形画到img上67 imshow("img",img);68 img.copyTo(tmp);69//截取矩形包围的图像,并保存到dst中70int width = abs(pre_pt.x - cur_pt.x);71int height = abs(pre_pt.y - cur_pt.y);72if (width == 0 || height == 0)73 {74 printf("width == 0 || height == 0");75return;76 }77 dst = org(Rect(min(cur_pt.x,pre_pt.x),min(cur_pt.y,pre_pt.y),width,height));78 namedWindow("dst");79 imshow("dst",dst);80 waitKey(0);81 }82}83void main()84{85 org = imread("1.jpg");86 org.copyTo(img);87 org.copyTo(tmp);88 namedWindow("img");//定义一个img窗口89 setMouseCallback("img",on_mouse,0);//调用回调函数91 cv::waitKey(0);92}2.2 程序运行结果分析程序源图形:程序运行结果:第三节,参考资料既然参考别人的博文,当然要把源资料介绍给大家,让大家参考一下:1. 在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域/quarryman/article/details/64355272.OpenCV响应鼠标函数cvSetMouseCallback()和其副程式onMouse ()的使用(OpenCV2.4.5)/glb562000520/article/details/8938582。
pythonopencv实现图⽚旋转矩形分割有时候需要对有⾓度的矩形框内图像从原图⽚中分割出来。
这⾥的程序思想是,先将图⽚进⾏矩形⾓度的旋转,使有⾓度的矩形处于⽔平状态后,根据原来坐标分割图⽚。
参考:修改原来的程序:1.旋转函数的输⼊仅为矩形的四点坐标2.⾓度由公式计算出来3.矩形四点pt1,pt2,pt3,pt4由txt⽂件读⼊4.在旋转程序中还处理了顺时针和逆时针及出现矩形框翻转的问题。
代码:# -*- coding:utf-8 -*-import cv2from math import *import numpy as npimport time,mathimport osimport re'''旋转图像并剪裁'''def rotate(img, # 图⽚pt1, pt2, pt3, pt4):print pt1,pt2,pt3,pt4withRect = math.sqrt((pt4[0] - pt1[0]) ** 2 + (pt4[1] - pt1[1]) ** 2) # 矩形框的宽度heightRect = math.sqrt((pt1[0] - pt2[0]) ** 2 + (pt1[1] - pt2[1]) **2)print withRect,heightRectangle = acos((pt4[0] - pt1[0]) / withRect) * (180 / math.pi) # 矩形框旋转⾓度print angleif pt4[1]>pt1[1]:print "顺时针旋转"else:print "逆时针旋转"angle=-angleheight = img.shape[0] # 原始图像⾼度width = img.shape[1] # 原始图像宽度rotateMat = cv2.getRotationMatrix2D((width / 2, height / 2), angle, 1) # 按angle⾓度旋转图像heightNew = int(width * fabs(sin(radians(angle))) + height * fabs(cos(radians(angle))))widthNew = int(height * fabs(sin(radians(angle))) + width * fabs(cos(radians(angle))))rotateMat[0, 2] += (widthNew - width) / 2rotateMat[1, 2] += (heightNew - height) / 2imgRotation = cv2.warpAffine(img, rotateMat, (widthNew, heightNew), borderValue=(255, 255, 255))cv2.imshow('rotateImg2', imgRotation)cv2.waitKey(0)# 旋转后图像的四点坐标[[pt1[0]], [pt1[1]]] = np.dot(rotateMat, np.array([[pt1[0]], [pt1[1]], [1]]))[[pt3[0]], [pt3[1]]] = np.dot(rotateMat, np.array([[pt3[0]], [pt3[1]], [1]]))[[pt2[0]], [pt2[1]]] = np.dot(rotateMat, np.array([[pt2[0]], [pt2[1]], [1]]))[[pt4[0]], [pt4[1]]] = np.dot(rotateMat, np.array([[pt4[0]], [pt4[1]], [1]]))# 处理反转的情况if pt2[1]>pt4[1]:pt2[1],pt4[1]=pt4[1],pt2[1]if pt1[0]>pt3[0]:pt1[0],pt3[0]=pt3[0],pt1[0]imgOut = imgRotation[int(pt2[1]):int(pt4[1]), int(pt1[0]):int(pt3[0])]cv2.imshow("imgOut", imgOut) # 裁减得到的旋转矩形框cv2.waitKey(0)return imgRotation # rotated image# 根据四点画原矩形def drawRect(img,pt1,pt2,pt3,pt4,color,lineWidth):cv2.line(img, pt1, pt2, color, lineWidth)cv2.line(img, pt2, pt3, color, lineWidth)cv2.line(img, pt3, pt4, color, lineWidth)cv2.line(img, pt1, pt4, color, lineWidth)# 读出⽂件中的坐标值def ReadTxt(directory,imageName,last):fileTxt=directory+"//rawLabel//"+imageName[:7]+last # txt⽂件名getTxt=open(fileTxt, 'r') # 打开txt⽂件lines = getTxt.readlines()length=len(lines)for i in range(0,length,4):pt2=list(map(float,lines[i].split(' ')[:2]))pt1=list(map(float,lines[i+1].split(' ')[:2]))pt4=list(map(float,lines[i+2].split(' ')[:2]))pt3=list(map(float,re.split('\n| ',lines[i+3])[:2]))# float转intpt2=list(map(int,pt2))pt1=list(map(int,pt1))pt4=list(map(int,pt4))pt3=list(map(int,pt3))imgSrc = cv2.imread(imageName)drawRect(imgSrc, tuple(pt1),tuple(pt2),tuple(pt3),tuple(pt4), (0, 0, 255), 2)cv2.imshow("img", imgSrc)cv2.waitKey(0)rotate(imgSrc,pt1,pt2,pt3,pt4)if __name__=="__main__":directory = "G://grasp//grapCode//trainImage//jpg//4"last = 'cneg.txt'imageName="pcd0247r.png"ReadTxt(directory,imageName,last)原带⾓度的矩形框:旋转矩形框:分割:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
opencv 矩形面积-回复中括号内的内容是"opencv 矩形面积",在本文中,我们将深入探讨OpenCV库中计算矩形面积的方法。
OpenCV是一个广泛使用的计算机视觉库,提供了各种功能来处理图像和视频。
计算矩形的面积是计算机视觉任务中的一个基本操作,我们将使用OpenCV库中的函数来实现这一操作。
为了开始使用OpenCV计算矩形面积,我们首先需要安装OpenCV库,并建立一个基本的Python环境。
安装OpenCV可以通过pip命令一步完成:pip install opencv-python一旦安装完成,我们就可以在Python代码中导入OpenCV库:pythonimport cv2在OpenCV中,图像是以像素点的数组或矩阵的形式表示的。
矩形是一个由四个顶点确定的几何形状,可以通过坐标来表示。
为了计算一个矩形的面积,我们需要知道矩形的宽度和高度。
在OpenCV中,可以通过将两个对角线上的点的坐标传递给函数来创建一个矩形对象。
然后,可以使用OpenCV的函数来计算矩形的宽度和高度。
下面是一个简单的示例,演示了如何计算矩形的面积:pythonimport cv2# 创建一个矩形对象rectangle = (50, 50, 200, 100)# 计算矩形的宽度和高度width = rectangle[2] - rectangle[0]height = rectangle[3] - rectangle[1]# 计算矩形的面积area = width * heightprint("矩形的面积为:", area)在这个例子中,我们创建了一个矩形对象,其左上角坐标为(50, 50),宽度为200,高度为100。
然后,我们通过计算矩形的宽度和高度来确定矩形的尺寸,并将二者相乘得到矩形的面积。
最后,我们打印出矩形的面积。
除了手动计算矩形的面积外,OpenCV还提供了一个函数来自动计算矩形的面积。
opencv 的rectangle参数摘要:1.OpenCV 简介2.rectangle 参数的概念3.rectangle 参数的使用方法4.rectangle 参数的属性5.示例代码正文:1.OpenCV 简介OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它包含了大量的图像处理和计算机视觉方面的算法。
OpenCV 用C++编写,同时还提供了Python 接口,使得开发者可以方便地在各种平台上进行图像处理和计算机视觉方面的开发。
2.rectangle 参数的概念在OpenCV 中,rectangle 参数是一个矩形框,它可以用来表示图像中的一个区域。
这个矩形框可以用来进行图像的裁剪、旋转、缩放等操作。
rectangle 参数通常包含四个属性:x, y, w, h,分别表示矩形框的左上角坐标(x, y) 以及矩形框的宽度(w) 和高度(h)。
3.rectangle 参数的使用方法要在OpenCV 中使用rectangle 参数,首先需要创建一个矩形框,然后使用这个矩形框来对图像进行操作。
以下是一个简单的示例,展示如何使用rectangle 参数来裁剪一张图片:```pythonimport cv2# 读取图片img = cv2.imread("image.jpg")# 创建一个矩形框,表示要裁剪的区域rect = cv2.Rect(10, 10, 200, 100)# 使用矩形框裁剪图片cropped_img = img(rect)# 显示裁剪后的图片cv2.imshow("Cropped Image", cropped_img)cv2.waitKey(0)cv2.destroyAllWindows()```4.rectangle 参数的属性rectangle 参数包含以下四个属性:- x:矩形框的左上角横坐标- y:矩形框的左上角纵坐标- w:矩形框的宽度- h:矩形框的高度这些属性可以通过设置或者获取的方式来修改和查询。
opencv 最大内切矩形
摘要:
一、简介
- 引入OpenCV 库
- 最大内切矩形概念
二、实现方法
- 寻找轮廓
- 计算矩形面积
- 计算内切矩形
三、代码实现
- 导入所需库
- 读取图像并转为灰度
- 应用阈值处理和形态学操作
- 寻找轮廓并计算矩形面积
- 计算内切矩形并输出结果
四、结论
- 总结最大内切矩形的作用
- 展望OpenCV 在计算机视觉领域的应用
正文:
一、简介
OpenCV,全称Open Source Computer Vision Library,是一个开源
的计算机视觉和机器学习软件库。
它包含了大量的图像处理、视频分析和计算机视觉方面的功能。
在实际应用中,我们常常需要对图像中的目标进行识别和定位,而最大内切矩形就是一种有效的目标定位方法。
本文将介绍如何使用OpenCV 实现最大内切矩形。
二、实现方法
要实现最大内切矩形,我们需要先找到图像中的轮廓,然后计算矩形的面积,最后找到最大的内切矩形。
具体步骤如下:
1.寻找轮廓
首先,我们需要从图像中找到目标的轮廓。
这可以通过使用OpenCV 中的Canny 边缘检测和轮廓提取算法实现。
2.计算矩形面积
对于每个轮廓,我们可以计算其对应的矩形面积。
矩形面积可以通过矩形的长和宽相乘得到。
3.计算内切矩形
内切矩形是指与目标轮廓相切的矩形,且该矩形的面积最小。
我们可以通过计算矩形的长和宽,找到最大的内切矩形。
三、代码实现
下面是使用Python 和OpenCV 实现最大内切矩形的示例代码:
```python
import cv2
import numpy as np
# 读取图像并转为灰度
img = cv2.imread("example.jpg", cv2.IMREAD_GRAYSCALE)
# 应用阈值处理和形态学操作
ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) kernel = np.ones((3, 3), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
# 寻找轮廓
contours, hierarchy = cv2.findContours(opening,
cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 计算矩形面积
areas = [cv2.contourArea(c) for c in contours]
# 计算内切矩形
min_area = min(areas)
max_area = max(areas)
for i, c in enumerate(contours):
if areas[i] == max_area:
x, y, w, h = cv2.boundingRect(c)
max_rect = (x, y, x + w, y + h)
# 输出结果
print("最大内切矩形:", max_rect)
```
四、结论
通过使用OpenCV 库,我们可以实现最大内切矩形的计算。
这种方法在目标定位和识别等领域具有广泛的应用。
作为一款功能强大的计算机视觉库,OpenCV 为各类研究和开发工作提供了极大的便利。