为了账号安全,请及时绑定邮箱和手机立即绑定

OpenCV鸟瞰视图而不会丢失数据

OpenCV鸟瞰视图而不会丢失数据

MM们 2019-11-04 12:59:35
我正在使用OpenCV来获取捕获帧的鸟瞰图。这是通过在飞机上提供棋盘图案来完成的,该棋盘图案将形成鸟瞰图。尽管看起来相机已经很漂亮了,但是我需要它完美以确定像素和厘米之间的关系。在下一阶段,捕获帧将被扭曲。它给出了预期的结果:但是,通过执行此转换,棋盘图案外部的数据将丢失。我需要的是旋转图像,而不是扭曲已知的四边形。问题:如何以摄像机角度旋转图像以使其自上而下?一些代码来说明我目前正在做什么:Size chessboardSize = new Size(12, 8); // Size of the chessboardSize captureSize = new Size(1920, 1080); // Size of the captured framesSize viewSize = new Size((chessboardSize.width / chessboardSize.height) * captureSize.height, captureSize.height); // Size of the viewMatOfPoint2f imageCorners; // Contains the imageCorners obtained in a earlier stageMat H; // Homography找到角落的代码:Mat grayImage = new Mat();//Imgproc.resize(source, temp, new Size(source.width(), source.height()));Imgproc.cvtColor(source, grayImage, Imgproc.COLOR_BGR2GRAY);Imgproc.threshold(grayImage, grayImage, 0.0, 255.0, Imgproc.THRESH_OTSU);imageCorners = new MatOfPoint2f();Imgproc.GaussianBlur(grayImage, grayImage, new Size(5, 5), 5); boolean found = Calib3d.findChessboardCorners(grayImage, chessboardSize, imageCorners, Calib3d.CALIB_CB_NORMALIZE_IMAGE + Calib3d.CALIB_CB_ADAPTIVE_THRESH + Calib3d.CALIB_CB_FILTER_QUADS);if (found) {    determineHomography();}确定单应性的代码:Point[] data = imageCorners.toArray();if (data.length < chessboardSize.area()) {    return;}Point[] roi = new Point[] {    data[0 * (int)chessboardSize.width - 0], // Top left    data[1 * (int)chessboardSize.width - 1], // Top right    data[((int)chessboardSize.height - 1) * (int)chessboardSize.width - 0], // Bottom left    data[((int)chessboardSize.height - 0) * (int)chessboardSize.width - 1], // Bottom right};Point[] roo = new Point[] {    new Point(0, 0),    new Point(viewSize.width, 0),    new Point(0, viewSize.height),    new Point(viewSize.width, viewSize.height)};MatOfPoint2f objectPoints = new MatOfPoint2f(), imagePoints = new MatOfPoint2f();objectPoints.fromArray(roo);imagePoints.fromArray(roi);Mat H = Imgproc.getPerspectiveTransform(imagePoints, objectPoints);
查看完整描述

4 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

您可以简单地推断:i,j可以从-inf+inf扩大范围,直到覆盖整个图像。i,j以格为单位,因此如果图像在每个方向上从起点到-1.5终点重叠1.5个网格单元(grid_cells_in_axis + 1.5)。顺便说一句,我现在正在尝试对此进行编码(因为在不久的将来我计划要完成的一项工作任务可能很快需要它)我已经完成了去噪和二值化。现在,我正在研究交叉点检测(也已完成,但我需要中心点而不是像素簇

查看完整回答
反对 回复 2019-11-04
?
手掌心

TA贡献1942条经验 获得超3个赞

毕竟我今天能正常工作,已更新答案。如果您想进一步扩大,我可以将其设置为仅使用纸板区域,您可以通过简单地更改fu,fv复制for循环中的限制,也可以在那里扩大调整大小和偏移量。它正在远离网格向上移动几个正方形...之后,畸变太大(但这是低分辨率图像)

查看完整回答
反对 回复 2019-11-04
  • 4 回答
  • 0 关注
  • 672 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信