Я предполагаю, что вы используете 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 - лучший выбор, чтобы пойти