You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 17:03:06