如何用OpenCV的ORB特征点检测获取绿色关键点的X/Y坐标?
获取ORB特征点的X、Y坐标
我需要获取图像内所有绿色ORB特征点的X、Y坐标,目前已能通过霍夫直线实现该需求,但尚未掌握使用ORB关键点检测的方法。
现有代码如下:
function setPhoto(){ var imgpath = 'https://cards.scryfall.io/large/front/9/d/9d3386e4-bbd6-4756-b29d-f55619e98d0d.jpg?1562820948'; var canvasid = 'canvas1'; var canvas = document.getElementById(canvasid); var context = canvas.getContext("2d"); var base_image = new Image(); base_image.src = imgpath; base_image.crossOrigin = 'Anonymous'; base_image.onload = function(){ canvas.setAttribute("width", base_image.width); canvas.setAttribute("height", base_image.height); context.drawImage(base_image, 0, 0, base_image.width, base_image.height); addOrbs(canvas, canvasid); }; } function addOrbs(currcanvas, canvasid){ var corners = []; var refCols = currcanvas.width; var refRows= currcanvas.height; var orb = new cv.ORB(5000); let src = cv.imread(canvasid); refGray = convertImageToGray(src) var noArray = new cv.Mat(); refDescr = new cv.Mat(); refKeyPts = new cv.KeyPointVector(); orb.detectAndCompute(refGray, noArray, refKeyPts, refDescr); // initialize reference image corners for warping corners[0] = new cv.Point( 0, 0 ); corners[1] = new cv.Point( refCols, 0 ); corners[2] = new cv.Point( refCols, refRows ); corners[3] = new cv.Point( 0, refRows ); let out = new cv.Mat(); cv.drawKeypoints(refGray, refKeyPts, out, [0, 255, 0, 255]); //console.log('out', out); cv.imshow(canvasid, out); refGray.delete(); } function convertImageToGray(img) { let dst = new cv.Mat(); cv.cvtColor(img, dst, cv.COLOR_RGBA2GRAY, 0); return dst; }
提取ORB特征点坐标的方法
在你的代码中,refKeyPts是cv.KeyPointVector类型对象,存储了所有检测到的ORB关键点。每个关键点的pt属性包含对应的X、Y坐标,你可以通过遍历这个向量来获取所有特征点坐标:
修改addOrbs函数,在orb.detectAndCompute之后添加以下代码:
// 存储所有特征点坐标的数组 const orbPoints = []; // 遍历KeyPointVector获取每个点的坐标 for (let i = 0; i < refKeyPts.size(); i++) { const keyPoint = refKeyPts.get(i); const x = keyPoint.pt.x; const y = keyPoint.pt.y; orbPoints.push({ x, y }); // 直接打印坐标查看 console.log(`特征点 ${i+1}: X=${x}, Y=${y}`); } // orbPoints数组已包含所有绿色ORB特征点的坐标 console.log('所有ORB特征点坐标:', orbPoints);
额外注意事项
- 确保OpenCV.js环境加载正常,
cv.KeyPoint的pt属性可正常访问 - 使用完
KeyPointVector和Mat对象后,记得调用delete()释放内存,避免泄漏,比如在函数末尾添加:
refKeyPts.delete(); refDescr.delete(); out.delete(); src.delete();
内容的提问来源于stack exchange,提问作者triplethreat77
相关产品推荐
相关产品推荐

