123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- #include "native_structs.h"
- #include "opencv2/core/types_c.h"
- #include "opencv2/core/core_c.h"
- #include <opencv2/opencv.hpp>
- //#include <opencv2/imgproc/imgproc.hpp>
- //#include <algorithm>
- static void captureDoc(std::vector<cv::Point> &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<cv::Point> 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;
- }
|