mirror of
https://github.com/Xevion/paperless-mobile.git
synced 2025-12-13 04:12:16 -06:00
feat: Add document scanner package
This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
#include "native_edge_detection.hpp"
|
||||
#include "edge_detector.hpp"
|
||||
#include "image_processor.hpp"
|
||||
#include "conversion_utils.hpp"
|
||||
#include <stdlib.h>
|
||||
#include <opencv2/opencv.hpp>
|
||||
|
||||
extern "C" __attribute__((visibility("default"))) __attribute__((used)) struct Coordinate *create_coordinate(double x, double y)
|
||||
{
|
||||
struct Coordinate *coordinate = (struct Coordinate *)malloc(sizeof(struct Coordinate));
|
||||
coordinate->x = x;
|
||||
coordinate->y = y;
|
||||
return coordinate;
|
||||
}
|
||||
|
||||
extern "C" __attribute__((visibility("default"))) __attribute__((used)) struct DetectionResult *create_detection_result(
|
||||
Coordinate *topLeft,
|
||||
Coordinate *topRight,
|
||||
Coordinate *bottomLeft,
|
||||
Coordinate *bottomRight)
|
||||
{
|
||||
struct DetectionResult *detectionResult = (struct DetectionResult *)malloc(sizeof(struct DetectionResult));
|
||||
detectionResult->topLeft = topLeft;
|
||||
detectionResult->topRight = topRight;
|
||||
detectionResult->bottomLeft = bottomLeft;
|
||||
detectionResult->bottomRight = bottomRight;
|
||||
return detectionResult;
|
||||
}
|
||||
|
||||
extern "C" __attribute__((visibility("default"))) __attribute__((used)) struct DetectionResult *detect_edges_from_file(char *str)
|
||||
{
|
||||
struct DetectionResult *coordinate = (struct DetectionResult *)malloc(sizeof(struct DetectionResult));
|
||||
cv::Mat mat = cv::imread(str);
|
||||
|
||||
if (mat.size().width == 0 || mat.size().height == 0)
|
||||
{
|
||||
return create_detection_result(
|
||||
create_coordinate(0, 0),
|
||||
create_coordinate(1, 0),
|
||||
create_coordinate(0, 1),
|
||||
create_coordinate(1, 1));
|
||||
}
|
||||
|
||||
vector<cv::Point> points = EdgeDetector::detect_edges(mat);
|
||||
|
||||
return create_detection_result(
|
||||
create_coordinate((double)points[0].x / mat.size().width, (double)points[0].y / mat.size().height),
|
||||
create_coordinate((double)points[1].x / mat.size().width, (double)points[1].y / mat.size().height),
|
||||
create_coordinate((double)points[2].x / mat.size().width, (double)points[2].y / mat.size().height),
|
||||
create_coordinate((double)points[3].x / mat.size().width, (double)points[3].y / mat.size().height));
|
||||
}
|
||||
|
||||
extern "C" __attribute__((visibility("default"))) __attribute__((used)) struct DetectionResult *detect_edges(uint8_t *bytes, int byteCount)
|
||||
{
|
||||
struct DetectionResult *coordinate = (struct DetectionResult *)malloc(sizeof(struct DetectionResult));
|
||||
Mat mat = ConversionUtils::bytearray_to_matrix(bytes, byteCount);
|
||||
|
||||
if (mat.size().width == 0 || mat.size().height == 0)
|
||||
{
|
||||
return create_detection_result(
|
||||
create_coordinate(0, 0),
|
||||
create_coordinate(1, 0),
|
||||
create_coordinate(0, 1),
|
||||
create_coordinate(1, 1));
|
||||
}
|
||||
|
||||
vector<cv::Point> points = EdgeDetector::detect_edges(mat);
|
||||
|
||||
return create_detection_result(
|
||||
create_coordinate((double)points[0].x / mat.size().width, (double)points[0].y / mat.size().height),
|
||||
create_coordinate((double)points[1].x / mat.size().width, (double)points[1].y / mat.size().height),
|
||||
create_coordinate((double)points[2].x / mat.size().width, (double)points[2].y / mat.size().height),
|
||||
create_coordinate((double)points[3].x / mat.size().width, (double)points[3].y / mat.size().height));
|
||||
}
|
||||
|
||||
extern "C" __attribute__((visibility("default"))) __attribute__((used)) bool process_image_from_file(
|
||||
char *path,
|
||||
double topLeftX,
|
||||
double topLeftY,
|
||||
double topRightX,
|
||||
double topRightY,
|
||||
double bottomLeftX,
|
||||
double bottomLeftY,
|
||||
double bottomRightX,
|
||||
double bottomRightY)
|
||||
{
|
||||
cv::Mat mat = cv::imread(path);
|
||||
|
||||
cv::Mat resizedMat = ImageProcessor::process_image(
|
||||
mat,
|
||||
topLeftX * mat.size().width,
|
||||
topLeftY * mat.size().height,
|
||||
topRightX * mat.size().width,
|
||||
topRightY * mat.size().height,
|
||||
bottomLeftX * mat.size().width,
|
||||
bottomLeftY * mat.size().height,
|
||||
bottomRightX * mat.size().width,
|
||||
bottomRightY * mat.size().height);
|
||||
|
||||
return cv::imwrite(path, resizedMat);
|
||||
}
|
||||
|
||||
extern "C" __attribute__((visibility("default"))) __attribute__((used))
|
||||
uint8_t *
|
||||
process_image(
|
||||
uint8_t *bytes,
|
||||
int byteCount,
|
||||
double topLeftX,
|
||||
double topLeftY,
|
||||
double topRightX,
|
||||
double topRightY,
|
||||
double bottomLeftX,
|
||||
double bottomLeftY,
|
||||
double bottomRightX,
|
||||
double bottomRightY)
|
||||
{
|
||||
cv::Mat mat = ConversionUtils::bytearray_to_matrix(bytes, byteCount);
|
||||
cv::Mat resizedMat = ImageProcessor::process_image(
|
||||
mat,
|
||||
topLeftX * mat.size().width,
|
||||
topLeftY * mat.size().height,
|
||||
topRightX * mat.size().width,
|
||||
topRightY * mat.size().height,
|
||||
bottomLeftX * mat.size().width,
|
||||
bottomLeftY * mat.size().height,
|
||||
bottomRightX * mat.size().width,
|
||||
bottomRightY * mat.size().height);
|
||||
|
||||
return ConversionUtils::matrix_to_bytearray(resizedMat);
|
||||
}
|
||||
Reference in New Issue
Block a user