#include "native_structs.h" #include "opencv2/core/types_c.h" #include "opencv2/core/core_c.h" #include //#include //#include static void captureDoc(std::vector &points, cv::Mat &input, cv::Mat &output) { assert(points.size() == 4); cv::Point ptTopLeft = points[0]; cv::Point ptTopRight = points[1]; cv::Point ptBottomLeft = points[2]; cv::Point ptBottomRight = points[3]; float w1 = sqrt(pow(ptBottomRight.x - ptBottomLeft.x, 2) + pow(ptBottomRight.x - ptBottomLeft.x, 2)); float w2 = sqrt(pow(ptTopRight.x - ptTopLeft.x, 2) + pow(ptTopRight.x - ptTopLeft.x, 2)); float h1 = sqrt(pow(ptTopRight.y - ptBottomRight.y, 2) + pow(ptTopRight.y - ptBottomRight.y, 2)); float h2 = sqrt(pow(ptTopLeft.y - ptBottomLeft.y, 2) + pow(ptTopLeft.y - ptBottomLeft.y, 2)); float maxWidth = (w1 < w2) ? w1 : w2; float maxHeight = (h1 < h2) ? h1 : h2; cv::Point2f src[4], dst[4]; src[0].x = ptTopLeft.x; src[0].y = ptTopLeft.y; src[1].x = ptTopRight.x; src[1].y = ptTopRight.y; src[2].x = ptBottomRight.x; src[2].y = ptBottomRight.y; src[3].x = ptBottomLeft.x; src[3].y = ptBottomLeft.y; dst[0].x = 0; dst[0].y = 0; dst[1].x = maxWidth - 1; dst[1].y = 0; dst[2].x = maxWidth - 1; dst[2].y = maxHeight - 1; dst[3].x = 0; dst[3].y = maxHeight - 1; cv::Mat undistorted = cv::Mat(cvSize(maxWidth, maxHeight), CV_8UC4); cv::warpPerspective(input, undistorted, cv::getPerspectiveTransform(src, dst), cvSize(maxWidth, maxHeight)); output = undistorted; undistorted.release(); } extern "C" __attribute__((visibility("default"))) __attribute__((used)) bool native_doc_crop(const char *imgPath, const char *outPath, CoordinateArray *coordList) { int len = coordList->length; std::vector points(len); cv::Mat input = cv::imread(imgPath), croppedImg; auto width = input.size().width; auto height = input.size().height; for (int i = 0; i < len; i++) { points[i].x = coordList->coordsPtr[i].x * width; points[i].y = coordList->coordsPtr[i].y * height; } captureDoc(points, input, croppedImg); auto ret = imwrite(outPath, croppedImg); return ret; }