opencv.js solvePnP()方法的使用

在使用此方法时,遇到很多问题,因为对python语言不是很了解,不知道转到JavaScript代码中要怎么使用solvePnP()方法。
后来通过写python代码的朋友帮助,并且通过看opencv源码解决此方法的使用。
如果有什么错误,欢迎纠正。
先上图:
python中数据的格式:python数据
opencv- solvePnP()方法源码
opencv-solvePnP
opencvjs版本最好是4.x及以上,3.x没有solvePnP()方法
重点是JavaScript中的solvePnP()的useExtrinsicGuess参数要是false
代码:

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>Hello OpenCV.js</title>
</head>

<body>
  <h2>Hello OpenCV.js</h2>
  <h2>solvePnP的使用</h2>
  <p id="status">OpenCV.js is loading...</p>
  <div>
    <button onClick="myclick()">输出结果</button>
  </div>
  <script type="text/javascript">
    function myclick() {
      //代码 solvePnP的使用
      let x = 4;
      let y = 23;
      let w = 10;
      let h = 20;
      let box_2d = [x, y, x + w, y + h];
      let start = [box_2d[0], box_2d[1]];
      let end = [box_2d[2], box_2d[3]];


      let person_h = 1.697;
      let person_radio = 0.4;  // width/height = 0.4 / 1
      let person_w = person_h * person_radio;


      // 构建人体平面
      let person_obj = [-person_w / 2.0, person_h / 2.0, 0.0,
      person_w / 2.0, person_h / 2.0, 0.0,
      person_w / 2.0, -person_h / 2.0, 0.0,
      -person_w / 2.0, -person_h / 2.0, 0.0];
      person_obj = cv.matFromArray(4, 3, cv.CV_32F, person_obj);


      let person_box = [
        start[0], start[1],
        end[0], start[1],
        end[0], end[1],
        start[0], end[1]
      ];
      person_box = cv.matFromArray(4, 2, cv.CV_32F, person_box);


      let cameraMatrix = [17908.65575, 0.0, 481.34968,
        0.0, 15996.73682, 718.54338,
        0.0, 0.0, 1.0];
      cameraMatrix = cv.matFromArray(3, 3, cv.CV_64F, cameraMatrix);


      let distCoeffs = [-28.409467, 1282.423080, -0.271868, 0.636307, 0.0];
      distCoeffs = cv.matFromArray(5, 1, cv.CV_64F, distCoeffs);


      let rvecs = new cv.Mat(3, 1, cv.CV_64F);
      let tvecs = new cv.Mat(3, 1, cv.CV_64F);
      //这里useExtrinsicGuess一定要是false
      let ret_val = cv.solvePnP(person_obj, person_box, cameraMatrix, distCoeffs, rvecs, tvecs, useExtrinsicGuess=false, flags = cv.SOLVEPNP_IPPE_SQUARE);

      console.log("-------ret_val--------");
      console.log(ret_val);
      console.log("-------rvecs--------");
      console.log("rvecs.data32F", rvecs.data32F);
      console.log("rvecs.data64F", rvecs.data64F);//正确的数据在这里面
      console.log("-------tvecs--------");
      console.log("tvecs", tvecs);
      console.log("tvecs.data32F", tvecs.data32F);
      console.log("tvecs.data64F", tvecs.data64F);//正确的数据在这里面
      //let rst = tvecs.ravel()
      console.log("-------rst--------");
      //console.log([rst[0], rst[2], rst[1]])

      //console.log("cv",cv)
    }
    function onOpenCvReady() {
      document.getElementById('status').innerHTML = 'OpenCV.js is ready.';
     
    }
  </script>
  <script async src="https://docs.opencv.org/4.x/opencv.js" onload="onOpenCvReady();" type="text/javascript"></script>
  <script src="https://docs.opencv.org/4.x/utils.js" type="text/javascript"></script>
</body>

</html>

结果:
结果

  • 22
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值