3.opencv常用操作

 一、绘制线段

cv2.line()

参数说明:

  • img:图像
  • color:线条颜色,元组形式。
  • pts:起始点
  • thickness:线条的粗细。-1为填充,默认为1。
  • linetype:线条类型。8型或者cv2.LINE_AA,默认为8型。
import cv2
import numpy as np

img = np.zeros((512,512,3), np.uint8)
cv2.line(img, (0,0), (511,511), (255,0,0), 5)  # 起始点,颜色,线条
cv2.imshow("example",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 二、绘制矩形

cv2.rectangle()

参数说明:

  • img:图像
  • pts:左上角和右下角坐标点
  • color:颜色,元组形式。
  • thickness:线条的粗细。-1为填充,默认值为1。
  • linetype:线条的类型,使用默认值即可。
import cv2
import numpy as np
img = np.zeros((512,512,3),np.uint8)

cv2.rectangle(img,(0,0),(122,122), (255,0,0),3)  # 左上角+右下角坐标,颜色,粗细
cv2.imshow("example", img)
cv2.waitKey(0)
cv2.destroyWindow()

三、画圆

 cv2.circle()

参数说明:

  • img:图像
  • pts:圆心
  • radius:半径
  • color:颜色
  • thickness:线条粗细。-1为填充,默认值为1。
  • linetype:线条类型,使用默认值即可。
import cv2
import numpy as np
img = np.zeros((255,225,3),np.uint8)
cv2.circle(img,(122,122),64,(0,255,255),-1) # -1表示填充
cv2.imshow("exmple",img)
cv2.waitKey(0)
cv2.destroyWindow()

四、绘制椭圆

cv2.ellipse()

参数说明:

  • 参数1:图片
  • 参数2:椭圆中心点
  • 参数3:x/y轴的长度
  • 参数4:angle--椭圆的旋转角度
  • 参数5:startAngle-椭圆的起始角度
  • 参数6:endAmgle-椭圆的结束角度
import cv2
import numpy as np

img = np.zeros((255, 255, 3), np.uint8)
# 中心点+长短轴+旋转角度+起始角度+终止角度
cv2.ellipse(img, (122, 122), (50, 10), 0, 0, 180, (255, 0, 0), -1) 
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyWindow()

五、绘制多边形

cv2.polylines()

参数说明:

  • 参数1:图片
  • 参数2:pts,表示的是点对
  • 参数3:isClosed,布尔型,Ture表示的是线段闭合,False表示的是仅保留线段
  • 参数4:color,线段的颜色,格式是(R,G,B)值
  • 参数5:thickness,线段粗细
  • 参数6:lineType,线型
import cv2
import numpy as np

img = np.zeros((255,255,3), np.uint8)
pts = np.array([[10,5], [50,10], [70,20], [20,30]])
print(pts.shape)

# 顶点个数:4,矩阵变成4*1*2维
pts = pts.reshape((-1, 1, 2))
print(pts.shape)

cv2.polylines(img,[pts],True,(0,255,0)) # Ture表示线段闭合
cv2.imshow("example",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

六、添加文字

cv2.putText()

参数说明:

  • 参数1:图片
  • 参数2:要添加的文字
  • 参数3:文字的起始位置,左下角为起点
  • 参数4:字体
  • 参数5:文字大小(缩放比例)
  • 参数6:颜色
  • 参数7:线条宽高
  • 参数8:线条形状
import cv2
import numpy as np

img = np.zeros((255, 255, 3), np.uint8)

font = cv2.FONT_HERSHEY_SCRIPT_SIMPLEX  # 设置字体
cv2.putText(img, "hello", (10, 110), font, 3, (255, 255, 0), 2, cv2.LINE_AA)  

cv2.imshow("example", img)
cv2.waitKey(0)
cv2.destroyWindow()

 综合案例:

import cv2
import numpy as np

img = np.zeros((640, 640, 3), np.uint8)

# 绘制直线
cv2.line(img, (0, 0), (255, 255), (255, 255, 0), 1)

# 绘制矩形
cv2.rectangle(img, (10, 10), (30, 20), (0, 255, 0), 3)

# 绘制圆形
cv2.circle(img, (120, 122), 23, (0, 255, 0), -1)

# 绘制椭圆
cv2.ellipse(img, (220, 220), (100, 50), 0, 0, 320, (250, 250, 0), -1)

# 绘制多边形
pts = np.array([[10, 5], [20, 30], [70, 20], [50, 10]])
pts.reshape([-1, 1, 2])
cv2.polylines(img, [pts], True, (0, 0, 255), 2)

# 添加文字
font = cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
cv2.putText(img, "opencv", (100, 50), font, 4, (255, 250, 10), 2)

cv2.imshow("example", img)
cv2.waitKey(0)
cv2.destroyWindow()

<think>我们正在处理一个Java/JavaCV/OpenCV的问题,用户想要将OpenCV的Rect对象转换为JavaCV的RectVector对象。 首先,我们需要理解这两个类的来源和用途: - `org.opencv.core.Rect` 是OpenCV Java库中的一个类,表示一个矩形区域。 - `org.bytedeco.opencv.opencv_core.RectVector` 是JavaCV(一个Java到OpenCV的桥梁)中的类,它实际上是一个Rect的向量(可以看作是一个动态数组或列表),用于存储多个Rect对象。 转换的目标是将一个或多个`org.opencv.core.Rect`对象放入`org.bytedeco.opencv.opencv_core.RectVector`中。 步骤: 1. 创建一个`RectVector`对象。 2.每个`org.opencv.core.Rect`转换为`org.bytedeco.opencv.opencv_core.Rect`(因为JavaCV的RectVector存储的是后一种Rect)。 3. 将转换后的Rect对象添加到RectVector中。 注意:`org.opencv.core.Rect`和`org.bytedeco.opencv.opencv_core.Rect`是不同库中的类,它们之间没有直接的继承关系,因此需要手动转换。 转换一个Rect对象: - `org.opencv.core.Rect` 有四个属性:x, y, width, height。 - `org.bytedeco.opencv.opencv_core.Rect` 也有对应的四个属性(或者我们可以通过构造函数或设置方法来创建)。 我们可以通过读取OpenCV Rect对象的属性,然后用这些属性创建一个JavaCV Rect对象。 假设我们有一个`org.opencv.core.Rect`对象:`Rect rect = new Rect(x, y, width, height);` 要将其转换为JavaCV的Rect,我们可以这样做: `org.bytedeco.opencv.opencv_core.Rect cvRect = new org.bytedeco.opencv.opencv_core.Rect(rect.x, rect.y, rect.width, rect.height);` 然后,将cvRect放入RectVector中。RectVector提供了push_back方法来添加元素。 示例代码: ```java import org.bytedeco.opencv.opencv_core.Rect; import org.bytedeco.opencv.opencv_core.RectVector; import org.opencv.core.Rect as OpenCVRect; // 为了避免命名冲突,使用别名 public class RectConverter { public RectVector convertOpenCVRectsToRectVector(List<OpenCVRect> openCvRects) { // 创建一个RectVector RectVector rectVector = new RectVector(); for (OpenCVRect openCvRect : openCvRects) { // 将每个OpenCVRect转换为JavaCV Rect Rect cvRect = new Rect(openCvRect.x, openCvRect.y, openCvRect.width, openCvRect.height); // 添加到RectVector rectVector.push_back(cvRect); } return rectVector; } } ``` 注意:上面的代码中,我们假设输入是一个OpenCV Rect的列表。如果只有一个Rect,也可以类似处理。 另外,需要处理内存管理吗?在JavaCV中,RectVector和Rect都是使用本地内存的,因此需要注意释放。通常,我们可以使用try-with-resources或者显式调用close()来释放。但是,如果这些对象在方法内创建并返回,那么调用者需要负责释放。或者,我们可以考虑使用JavaCV的指针作用域(PointerScope)来管理。 但是,由于用户没有提到内存管理,我们暂时按照基本转换来写。 另外,如果用户使用的是JavaCV,可能更希望直接使用JavaCV的Rect类,以避免转换。但问题中明确要求转换,所以我们按照转换来写。 引用:在OpenCV和JavaCV的文档中,Rect和RectVector都是基本的数据结构,用于表示矩形区域和矩形向量[^1][^2]。 现在,生成相关问题: 1. 如何将JavaCV的RectVector转换回OpenCV的Rect数组? 2. 在JavaCV中,RectVector有哪些常用操作方法? 3. 在使用JavaCV处理图像时,如何避免内存泄漏? 4. JavaCV和OpenCV Java库在矩形处理上有何异同?</think>### 将 OpenCV Rect 转换为 JavaCV RectVector 在 JavaCV 中转换 `org.opencv.core.Rect` 到 `org.bytedeco.opencv.opencv_core.RectVector` 需要手动处理,因为两者属于不同的库体系。以下是具体步骤: #### 1. **核心转换逻辑** ```java import org.bytedeco.opencv.opencv_core.*; import org.opencv.core.Rect; public RectVector convertRects(Rect[] openCvRects) { // 创建空的 RectVector RectVector rectVector = new RectVector(); // 遍历并转换每个 Rect for (Rect r : openCvRects) { // 创建 JavaCV 的 Rect 对象 Rect cvRect = new Rect(r.x, r.y, r.width, r.height); // 添加到 RectVector rectVector.push_back(cvRect); } return rectVector; } ``` #### 2. **使用示例** ```java // 原始 OpenCV Rect 数组 Rect[] opencvRects = { new Rect(10, 20, 30, 40), new Rect(50, 60, 70, 80) }; // 转换 RectVector javaCvRectVector = convertRects(opencvRects); // 使用示例:传递给 JavaCV 函数 someJavaCVFunction(javaCvRectVector); ``` #### 3. **关键说明** - **手动映射**:JavaCV 的 `Rect` 构造函数需显式传入坐标和尺寸参数(`x, y, width, height`)。 - **内存管理**:JavaCV 对象基于本地内存,建议通过 `try()` 自动释放资源: ```java try (RectVector rectVector = new RectVector()) { // 添加 Rect 并操作 } // 自动调用 close() ``` - **性能优化**:批量转换时预分配容量: ```java RectVector rectVector = new RectVector(opencvRects.length); ``` #### 4. **依赖注意事项** - 确保项目中同时包含 OpenCV 和 JavaCV 依赖: ```xml <!-- OpenCV --> <dependency> <groupId>org.openpnp</groupId> <artifactId>opencv</artifactId> <version>4.5.5-1</version> </dependency> <!-- JavaCV --> <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.5.7</version> </dependency> ``` > **引用说明**:JavaCV 在 `org.bytedeco.opencv.global.opencv_highgui` 中封装了 OpenCV 的窗口组件方法[^1],而 Rect 转换需手动处理坐标映射,因其属于不同库体系。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值