在使用此方法时,遇到很多问题,因为对python语言不是很了解,不知道转到JavaScript代码中要怎么使用solvePnP()方法。
后来通过写python代码的朋友帮助,并且通过看opencv源码解决此方法的使用。
如果有什么错误,欢迎纠正。
先上图:
python中数据的格式:
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>
结果: