Java OpenCV关于Mat的常用操作 修改尺寸 旋转 翻转 文字

本文档详细介绍了使用Java OpenCV库对Mat对象进行操作,包括修改尺寸、旋转、翻转、画矩形框、添加文字和画直线等基本步骤,帮助Java开发者在计算机视觉项目中更好地应用OpenCV。

说明

先说一个通用的规则,个人理解

  • C语言中CV::对象,在Java是Core (org.opencv.core.Core)
  • -C语言中cv开头的方法,在Java是Imgproc(org.opencv.imgproc.Imgproc)
  • 有了以上规则,遇到问题就可以搜索c版的opencv,比较java版的确实少

图片

在OpenCV中图片被存储在Mat(org.opencv.core)容器中

修改尺寸

Size size = new Size(720,680);
Mat dstMat= new Mat();
/**
 * srcMat 原图,dstMat目标,size裁剪后大小
 */
Imgproc.resize(srcMat, dstMat, size);
srcMat.release();
srcMat = dstMat; //释放资源

旋转

Mat dstMat= new Mat();
//旋转90°
int angle = 90;
Imgproc.warpAffine(srcMat, dstMat, Imgproc.getRotationMatrix2D(new Point(dstMat.width() / 2, dstMat.height() / 2), angle, 1.0), size);
srcMat.release();
srcMat= dstMat;

翻转

Mat dstMat= new Mat();
/**
 * srcMat 原图,dstMat目标,
 * opencv翻转:
 * flipCode:
 * = 0 图像向下翻转 (垂直翻转)
 * > 0 图像向右翻转(水平翻转)
 * < 0 图像同时向下向右翻转 (水平垂直翻转)
 */
Core.flip(srcMat, dstMat, mode);
srcMat.release();
srcMat = dstMat; //释放资源

画矩形框

//这里的顺序是GBR,不是RGB
Scalar color = new Scalar(0,0,255);
//矩形框
Rect rect = new Rect(0,0,100,100;
Imgproc.rectangle(mat, rect,color );

添加文字

//这里的顺序是GBR,不是RGB
Scalar color = new Scalar(0,0,255);
//矩形框
Rect rect = new Rect(0,0,100,100;

Imgproc.putText(mat, "Hello", new Point(rect.x, rect.y), FONT_HERSHEY_SIMPLEX, 1,color);

如果要显示中文好像要添加底层的依赖库,暂时没弄

画直线

Scalar color = new Scalar(0,0,255);
Rect rect = new Rect(0,0,100,100;
Imgproc.line(mat, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), color );
### Java OCR 获取图片中文字旋转角度 在使用 Java 进行 OCR(光学字符识别)时,获取图片中文字旋转角度可以通过以下几种方法实现。这些方法结合了图像预处理和 OCR 引擎的功能。 #### 方法一:基于 Tesseract 的 Orientation and Script Detection (OSD) Tesseract 提供了一个名为 Orientation and Script Detection (OSD) 的功能,可以检测文本的方向、语言脚本以及是否需要翻转等信息。通过调用此功能,可以获得图片中文本的旋转角度。 以下是实现步骤: 1. **引入依赖** 需要引入 Tess4J 作为 Tesseract 的 Java 封装库。确保项目中包含 Tess4J 和 Tesseract 的相关依赖。 2. **核心代码** 使用 Tess4J 提供的 `TessAPI` 类来执行 OSD 操作,并解析返回的结果。 ```java import net.sourceforge.tess4j.ITesseract; import net.sourceforge.tess4j.TessAPI; import net.sourceforge.tess4j.Tesseract; import net.sourceforge.tess4j.util.LoadLibs; public class OcrRotationExample { public static void main(String[] args) { ITesseract instance = new Tesseract(); instance.setDatapath("tessdata"); // 设置语言数据包路径 instance.setLanguage("eng"); // 设置语言为英文 // 加载 Tesseract API TessAPI api = TessAPI.INSTANCE; byte[] imageBytes = LoadLibs.getBinaryResourceAsByteArray("example.png"); long start = System.currentTimeMillis(); // 执行 OSD 检测 String osdResult = instance.doOCR(new File("example.png"), null, TessAPI.TessPageIteratorLevel.RIL_TEXTLINE, true); System.out.println("OSD Result: " + osdResult); long end = System.currentTimeMillis(); System.out.println("Time taken: " + (end - start) + " ms"); } } ``` 上述代码中,`doOCR` 方法设置了 `osdOnly` 参数为 `true`,表示仅执行方向检测[^2]。 3. **结果解析** OSD 返回的结果是一个字符串,包含以下字段: - `Orientation`: 文本方向。 - `Rotate`: 旋转角度(以度为单位)。 - `Script`: 文本使用的语言脚本。 #### 方法二:结合图像预处理工具 如果需要更精确的角度检测,可以结合 Lept4J 或 OpenCV 等图像处理库对图片进行预处理。例如,可以通过以下步骤实现: 1. **边缘检测** 使用 Canny 边缘检测算法提取图片中的线条。 2. **霍夫变换** 应用霍夫变换检测图片中的直线,并计算其倾斜角度。 3. **代码示例** 以下是一个基于 OpenCV 的示例代码,用于检测图片中文本的倾斜角度。 ```java import org.bytedeco.opencv.global.opencv_core; import org.bytedeco.opencv.global.opencv_imgcodecs; import org.bytedeco.opencv.global.opencv_imgproc; import org.bytedeco.opencv.opencv_core.Mat; import org.bytedeco.opencv.opencv_core.Point; import org.bytedeco.opencv.opencv_core.Scalar; public class ImageRotationDetection { public static void main(String[] args) { Mat src = opencv_imgcodecs.imread("example.png", opencv_imgcodecs.IMREAD_GRAYSCALE); Mat edges = new Mat(); Mat lines = new Mat(); // Canny 边缘检测 opencv_imgproc.Canny(src, edges, 50, 150, 3, false); // 霍夫变换检测直线 opencv_imgproc.HoughLines(edges, lines, 1, Math.PI / 180, 150); double angle = 0; for (int i = 0; i < lines.rows(); i++) { double[] line = lines.get(i, 0); double rho = line[0], theta = line[1]; if (theta > Math.PI / 4 && theta < 3 * Math.PI / 4) { angle = Math.toDegrees(theta - Math.PI / 2); } else { angle = Math.toDegrees(theta); } } System.out.println("Detected Angle: " + angle + " degrees"); } } ``` 上述代码通过霍夫变换检测图片中的直线,并计算其倾斜角度[^1]。 #### 方法三:结合百度 OCR API 百度 OCR API 提供了丰富的功能,包括文字识别、方向检测等。通过调用百度 OCR API 的通用文字识别接口,可以获取图片中文本的方向信息。 1. **申请 API 密钥** 在百度智能云平台注册账号并申请 OCR API 密钥。 2. **调用接口** 使用 Java 调用百度 OCR API,获取返回的 JSON 数据。 ```java import com.alibaba.fastjson.JSONObject; import okhttp3.*; public class BaiduOcrExample { public static void main(String[] args) throws Exception { OkHttpClient client = new OkHttpClient(); MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded"); RequestBody body = RequestBody.create(mediaType, "image=base64_encoded_image_data&detect_direction=true"); Request request = new Request.Builder() .url("https://aip.baidubce.com/rest/2.0/ocr/v1/general?access_token=your_access_token") .post(body) .addHeader("Content-Type", "application/x-www-form-urlencoded") .build(); Response response = client.newCall(request).execute(); String responseBody = response.body().string(); JSONObject jsonObject = JSONObject.parseObject(responseBody); int direction = jsonObject.getJSONArray("words_result").getJSONObject(0).getIntValue("direction"); System.out.println("Text Direction: " + direction); } } ``` 上述代码中,`detect_direction` 参数设置为 `true`,表示启用方向检测功能[^2]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值