【问题标题】:how to find corner vector from opencv.js如何从 opencv.js 中找到角向量
【发布时间】:2019-05-22 03:09:18
【问题描述】:

这是我的代码的一部分

export default class Comp extends Component {
  onChange = async evt => {
    const { files } = evt.target
    const reader = new FileReader()
    reader.onload = (e) => this.refs.preview.src = e.target.result
    reader.readAsDataURL(files[0])

    this.refs.preview.onload = () => {
      let src = cv.imread(this.refs.preview)
      let dst = new cv.Mat()

      cv.cvtColor(src, src, cv.COLOR_RGB2GRAY, 0)
      cv.threshold(src, src, 180, 300, cv.THRESH_BINARY)

      let largest_area = 0
      let largest_contour_index = 0

      let dst1 = cv.Mat.zeros(src.rows, src.cols, cv.CV_8UC3)
      let contours = new cv.MatVector()
      let hierarchy = new cv.Mat()

      cv.findContours(src, contours, hierarchy, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE)

      for (let i = 0; i < contours.size(); ++i) {
        let color = new cv.Scalar(255, 0, 0)
        let color2 = new cv.Scalar(0, 255, 0)
        let area = cv.contourArea(contours.get(i))
        if (area > largest_area) {
          largest_area = area
          largest_contour_index = i
          cv.drawContours(dst1, contours, i, color, 5, cv.LINE_8)
        }
      }

      cv.imshow('processed', dst1)
      src.delete()
      dst.delete()
      dst1.delete()
    }
  }

  render() {
    return (
      <div>
        <form action="">
          <input type="file" onChange={this.onChange} />
        </form>
        <div className='flex'>
          <div className='flex-1'>
            <img ref='preview' id='preview' style={{ width: '100%' }} />
          </div>
          <div className='flex-1'>
            <canvas id='processed' />
            <img ref='processed' style={{ width: '100%' }} />
          </div>
        </div>
      </div>
    )
  }
}

结果是这样的

我想获取这些轮廓数据并进行透视变换,并将其保存到 db。

【问题讨论】:

    标签: opencv opencv-contour


    【解决方案1】:

    我假设您使用的是 Java。我不是很好,我是 C++ 的核心,python 也可以。

    无论如何,我会尽力提供帮助。

    vector<vector<Point> > contours;
    

    这是 C++ 中轮廓的原型。所以这意味着外面是轮廓的id,里面是坐标数组。 例如,你想知道第一个轮廓,然后你可以找到

    vector<Point> firstcontourcoord = contours.at(0);
    

    那么里面的点就是你想要的点。所以继续寻找最大的轮廓ID。

    在你想要改造之后,它需要更多的东西。

    现在你应该已经声明了你想要的目标短号点位置,例如

    var vv = cv.matFromArray( 4,3,cv.CV_32SC1,[
        0,0,0,
        0,210,0,
        290,210,0,
        290,0,0,
    ])
    // sample A4 size
    
    // 2D img coords from largest bounding countour. Example
    var imageP = cv.matFromArray( 4,2,cv.CV_8S,[
        292,272,
        72,379,
        487,530,
        701,470,
    ])
    

    然后您可以选择使用 3D 或 2D 变换。 对于 3D 可视化/AR,其

    var cm = new cv.Mat(3,3,cv.CV_32FC1,new cv.Scalar())
    \\plz find it. this is just a sample. find camera matrix and do unistort
    var rvec
    var tvec
    cv.solvePnP( vv, imageP, cm, new cv.Mat(), rvec, tvec, false, cv.SOLVEPNP_P3P )
    

    那么你就有了矩阵。

    然后应用转换。

    但我认为你可能只是在做那些文书工作,你只需要 2D 转换,那么它就是

    Mat H = Calib3d.findHomography( objMat, sceneMat, Calib3d.RANSAC, ransacReprojThreshold );
            //-- Get the corners from the image_1 ( the object to be "detected" )
            Mat objCorners = new Mat(4, 1, CvType.CV_32FC2), sceneCorners = new Mat();
            float[] objCornersData = new float[(int) (objCorners.total() * objCorners.channels())];
            objCorners.get(0, 0, objCornersData);
            objCornersData[0] = 0;
            objCornersData[1] = 0;
            objCornersData[2] = imgObject.cols();
            objCornersData[3] = 0;
            objCornersData[4] = imgObject.cols();
            objCornersData[5] = imgObject.rows();
            objCornersData[6] = 0;
            objCornersData[7] = imgObject.rows();
            objCorners.put(0, 0, objCornersData);
            Core.perspectiveTransform(objCorners, sceneCorners, H);
            float[] sceneCornersData = new float[(int) (sceneCorners.total() * sceneCorners.channels())];
            sceneCorners.get(0, 0, sceneCornersData);
    

    DB 我不是很熟悉。我只擅长基于旧 C# .net 的方法。别人从来不碰。但是一旦你有了图像,只需在数据库中推送你的图像。应该没有太大问题。

    编辑# 你可以点击下面的链接为你实现

    选择 Java 版本 https://docs.opencv.org/3.4/df/d0d/tutorial_find_contours.html
    https://docs.opencv.org/3.4/d7/dff/tutorial_feature_homography.html

    你只需要从这两个链接复制代码。你很高兴。 Java是最乏味的方式。个人认为 C++ 或 python 是更好的选择

    【讨论】:

    • 我使用 opencv.js,它的 javascript 很难找出与 javascript 相关的 api。但我认为这个想法是一样的。无论如何,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-01-01
    • 2015-01-10
    • 2013-08-28
    • 1970-01-01
    • 2022-01-05
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多