首页 > 编程语言 >java opencv 获取图中物品的倾斜角度(单个物品,如果存在多个物品,建议先将多个物品处理成一个整体或分别切割开处理)

java opencv 获取图中物品的倾斜角度(单个物品,如果存在多个物品,建议先将多个物品处理成一个整体或分别切割开处理)

时间:2024-08-21 09:38:03浏览次数:10  
标签:src angel 多个 width double height opencv 物品 Math

// 1、先连上opencv包

System.setProperty("java.awt.headless", "false");
System.out.println(System.getProperty("java.library.path"));
URL url = ClassLoader.getSystemResource("lib/opencv/opencv_java4100.dll");
System.load(url.getPath());

// 2、计算倾斜的角度
String filePath = "需要处理的文件路径";
Mat src = Imgcodecs.imread(filePath);
Mat gary = new Mat();
Imgproc.cvtColor(src, gary, Imgproc.COLOR_RGB2GRAY);
Imgproc.GaussianBlur(gary, gary, new Size(3, 3), 0);
Imgproc.GaussianBlur(gary, gary, new Size(3, 3), 0);
Mat edge = new Mat();
Imgproc.Canny(gary, edge, 30, 50);

Mat lines = new Mat();
Imgproc.HoughLinesP(edge, lines, 1, Math.PI/180, 100, 50, 10);

double angle = 0.0;
for (int i = 0; i < lines.cols(); i++) {
double rho = lines.get(0, i)[0];
double theta = lines.get(0, i)[1];
double cosTheta = Math.cos(theta);
double sinTheta = Math.sin(theta);
double x0 = rho * cosTheta;
double y0 = rho * sinTheta;
double x1 = x0 + 1000 * (-sinTheta);
double y1 = y0 + 1000 * (cosTheta);
double x2 = x0 - 1000 * (-sinTheta);
double y2 = y0 - 1000 * (cosTheta);

angle += Math.atan2(y2 - y1, x2 - x1) * 180.0 / Math.PI;
}
angle /= lines.cols();
System.out.println("angle = " + angle);

if (angle < 0){
angle = 180 - angle;
}


// 3、旋转图像并显示,其实opencv也可以旋转图像,但效果感觉不如Java

BufferedImage image = ImageIO.read(new File(filePath));
BufferedImage rotate = ImageUtils.Rotate(image, angle);

BufferedImage grayImage = new BufferedImage(rotate.getWidth(),rotate.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
ColorConvertOp op = new ColorConvertOp(null);
grayImage = op.filter(rotate, grayImage);

Mat src = Mat.zeros(new Size(rotate.getWidth(), rotate.getHeight()), CvType.CV_8UC3);

byte[] imageData = ((DataBufferByte) grayImage.getRaster().getDataBuffer()).getData();
src.put(0,0,imageData);

HighGui.namedWindow("dst", HighGui.WINDOW_NORMAL);
HighGui.resizeWindow("dst", 1600, 900);
HighGui.imshow("dst", dst);
HighGui.waitKey(0);

src.release();
gary.release();
edge.release();
lines.release();
HighGui.destroyAllWindows();
System.exit(0);









// 上面 ImageUtils.Rotate是一个自定义的旋转方法,具体代码如下:


    //region 图片旋转
/**

* 对图片进行旋转

*

* @param src 被旋转图片

* @param angel 旋转角度

* @return 旋转后的图片

*/

public static BufferedImage Rotate(Image src, int angel) {

int src_width = src.getWidth(null);

int src_height = src.getHeight(null);

// 计算旋转后图片的尺寸

Rectangle rect_des = CalcRotatedSize(new Rectangle(new Dimension(

src_width, src_height)), angel);

BufferedImage res = null;

res = new BufferedImage(rect_des.width, rect_des.height,

BufferedImage.TYPE_INT_RGB);

Graphics2D g2 = res.createGraphics();

// 进行转换

g2.translate((rect_des.width - src_width) / 2,

(rect_des.height - src_height) / 2);

g2.rotate(Math.toRadians(angel), src_width / 2, src_height / 2);

g2.drawImage(src, null, null);

return res;

}

/**

* 计算旋转后的图片

*

* @param src 被旋转的图片

* @param angel 旋转角度

* @return 旋转后的图片

*/

public static Rectangle CalcRotatedSize(Rectangle src, int angel) {

// 如果旋转的角度大于90度做相应的转换

if (angel >= 90) {

if (angel / 90 % 2 == 1) {

int temp = src.height;

src.height = src.width;

src.width = temp;

}

angel = angel % 90;

}

double r = Math.sqrt(src.height * src.height + src.width * src.width) / 2;

double len = 2 * Math.sin(Math.toRadians(angel) / 2) * r;

double angel_alpha = (Math.PI - Math.toRadians(angel)) / 2;

double angel_dalta_width = Math.atan((double) src.height / src.width);

double angel_dalta_height = Math.atan((double) src.width / src.height);

int len_dalta_width = (int) (len * Math.cos(Math.PI - angel_alpha

- angel_dalta_width));

int len_dalta_height = (int) (len * Math.cos(Math.PI - angel_alpha

- angel_dalta_height));

int des_width = src.width + len_dalta_width * 2;

int des_height = src.height + len_dalta_height * 2;

return new Rectangle(new Dimension(des_width, des_height));

}

//endregion



标签:src,angel,多个,width,double,height,opencv,物品,Math
From: https://www.cnblogs.com/Lee597/p/18370955

相关文章

  • tcp多个客户端访问服务端,运用多线程
    客户端packagecom.shujia.day20.tcpdemo3;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.Socket;importjava.util.Scanner;/*1:建立客户端的Socket服务,并明确要连接的服务器。2:如果连接建立成功,就表明,已经建立了数据传输的通......
  • springboot怎么配置多个yml文件
    目录方式一:多个yml文件方式二:单个yml文件方式三:在pom.xml中指定环境配置掌握方式一就够了,方式二、三可以不看以下三种方式都可以实现多环境的配置。在application.yml主配置文件中做项目通用的配置,在其他配置文件中做不同环境下的配置,以避免重复配置的情况。方式......
  • 免费【2024】基于springboot 闲置物品共享平台的设计与实现
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • 【OpenCV教程】特征工程
    @目录1.模板匹配1.1原理1.2API1.3模板匹配计算方法1.4掩码的使用获得掩码1.5效果1.5模板匹配的缺陷无法应对旋转无法应对缩放2.cornerHarris(对灰度图)2.1角点的描述2.2原理(前置知识要求:线性代数)(以下为bolcksize=2的情况)2.3API2.4流程2.5优点与缺点测试代码图片旋转,角......
  • 【OpenCV教程】轮廓检测过程
    @目录1.查找轮廓1.1API1.2轮廓层级检测模式:索引号(层级)RETR_EXTERNAL(索引顺序:从右下到左上)RETR_LIST(recommended)(索引顺序:从右下到左上,由外到内)RETR_CCOMP(notrecommended)(索引顺序:由内到外,从右下到左上)RETR_TREE(recommended)1.3轮廓坐标点储存方式2.绘制轮廓2.1API3.轮廓面......
  • OpenCV(cv::SparseMat)
    目录1.主要特点和用途2.主要方法和成员函数3.示例代码4.优缺点cv::SparseMat是OpenCV中表示稀疏矩阵的类。稀疏矩阵用于存储大多数元素为零的矩阵,以节省内存和计算时间。与普通的密集矩阵不同,稀疏矩阵仅存储非零元素及其坐标。1.主要特点和用途稀疏数据存储:当......
  • Docker compose 部署前后端-----采用nginx代理,支持一个端口部署多个前端
    Dockercompose部署前后端-----采用nginx代理,支持一个端口部署多个前端1、Linux服务器安装最新版docker,确保有dockercompose命令2、创建docker工作区目录mkdirdocker-workspace3、进入docker工作区目录,创建前端nginx目录,创建后端xxx目录mkdirnginxxxx4、创建confi......
  • ArchLinux配置OpenCV C++环境
    本文将简单介绍在ArchLinux中安装OpenCVC++库并运行一个简单的OpenCV程序的过程。参考:https://github.com/donaldssh/Install-OpenCV我的环境最新的ArchLinuxKDEPlasma6桌面环境OpenCV4.10.0clang18.1.8gcc14.2.1安装安装以下包:sudopacman-Shdf5vtk......
  • python opencv实时视频输入
    要在Python中使用OpenCV进行实时视频输入,可以按照以下步骤进行操作:首先,需要安装OpenCV库。可以使用pipinstallopencv-python命令来安装OpenCV。导入所需的库:importcv2创建一个VideoCapture对象来读取视频输入:cap=cv2.VideoCapture(0)这里的参数0表示使用计......
  • OpenCV-Python系列之对极几何
    点击查看代码importnumpyasnpimportcv2ascvimg1=cv.imread("data1/1.png",0)#queryimageleftimageimg2=cv.imread("data1/2.png",0)#trainimagerightimagesift=cv.SIFT_create()#sift1=cv.xfeatures2d.SIFT_create()kp1,des1=sift.dete......