как найти угловой вектор из opencv.js - PullRequest
0 голосов
/ 22 мая 2019

это часть моего кода

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>
    )
  }
}

результат как

enter image description here

Я хочу получить эти данные контуров и выполнить преобразование перспективы и сохранить их в дБ.

1 Ответ

0 голосов
/ 22 мая 2019

Я предполагаю, что вы используете Java. Я не очень хорош в этом, я ядро ​​в C ++, Python также хорошо.

Я все равно постараюсь помочь.

vector<vector<Point> > contours;

это прототип контуров в C ++. значит, снаружи - это идентификатор контура, а внутри - массив координат. Например, вы хотите узнать первые контуры, затем вы можете найти по

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

Тогда точка внутри - это точка, которую вы хотите. Итак, продолжайте и найдите самый большой идентификатор контура.

После этого вы хотите трансформироваться, ему нужно еще кое-что.

прямо сейчас вы должны были объявить целевую позицию точки корнета, например,

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);

БД Я не очень знаком. Я только хорош со старым методом на основе 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

U просто нужно скопировать код из этих 2 ссылок. и ты в порядке. Java - самый утомительный путь. Лично C ++ или Python - лучший выбор, чтобы пойти

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...