c ++ — OpenCV с распознаванием текста

Мне нужно распознать текст на изображении, а затем обрезать прямоугольник с текстом, чтобы уменьшить размер изображения

Первый шаг — распознать текст, и я нашел решение здесь

Извлечение текста OpenCV

Но как скомпилировать и запустить это из PHP? Я не знаком с C

Как скомпилировать код, чтобы вы могли передавать аргументы в программу, как exec('opencv_test input.jpg output.jpg')

Вместо того, чтобы рисовать прямоугольники вокруг каждого текстового блока, программа должна проанализировать все текстовые блоки и получить две координаты, в которых должно быть обрезано изображение. Затем обрезать изображение и записать выходной файл в выходной файл.

#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

#define INPUT_FILE              "1.jpg"#define OUTPUT_FOLDER_PATH      string("")

int _tmain(int argc, _TCHAR* argv[])
{
Mat large = imread(INPUT_FILE);
Mat rgb;
// downsample and use it for processing
pyrDown(large, rgb);
Mat small;
cvtColor(rgb, small, CV_BGR2GRAY);
// morphological gradient
Mat grad;
Mat morphKernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
morphologyEx(small, grad, MORPH_GRADIENT, morphKernel);
// binarize
Mat bw;
threshold(grad, bw, 0.0, 255.0, THRESH_BINARY | THRESH_OTSU);
// connect horizontally oriented regions
Mat connected;
morphKernel = getStructuringElement(MORPH_RECT, Size(9, 1));
morphologyEx(bw, connected, MORPH_CLOSE, morphKernel);
// find contours
Mat mask = Mat::zeros(bw.size(), CV_8UC1);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(connected, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
// filter contours
for(int idx = 0; idx >= 0; idx = hierarchy[idx][0])
{
Rect rect = boundingRect(contours[idx]);
Mat maskROI(mask, rect);
maskROI = Scalar(0, 0, 0);
// fill the contour
drawContours(mask, contours, idx, Scalar(255, 255, 255), CV_FILLED);
// ratio of non-zero pixels in the filled region
double r = (double)countNonZero(maskROI)/(rect.width*rect.height);

if (r > .45 /* assume at least 45% of the area is filled if it contains text */
&&
(rect.height > 8 && rect.width > 8) /* constraints on region size */
/* these two conditions alone are not very robust. better to use something
like the number of significant peaks in a horizontal projection as a third condition */
)
{
rectangle(rgb, rect, Scalar(0, 255, 0), 2);
}
}
imwrite(OUTPUT_FOLDER_PATH + string("rgb.jpg"), rgb);

return 0;
}

-4

Решение

Вы можете увидеть комментарий GPPK. Это должно работать для вас. Однако, если вам нужен какой-то быстрый способ без большого количества дополнительных библиотек и оболочек. Просто скомпилируйте ваш код на C ++ в исполняемый файл (например, exe или что-то еще в вашей платформе) и укажите аргумент возможности (передавая путь изображения в качестве аргумента). Тогда, я думаю, вы можете вызвать это из своего PHP-кода. Насколько я знаю, PHP является серверной частью, поэтому это должно быть легкой задачей. Тем не менее, вы можете запросить разрешение у вашего хостинга или у администратора сервера, чтобы дать вам возможность запустить exe-файл на сервере.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector