Używam opencv_contrib do wykrywania regionów tekstowych na obrazie.Łączenie zachodzących na siebie grup na obrazku
Jest to obraz
Jest to obraz po występują obszary tekstowe oryginalny:
Jak widać, istnieją grupy nakładających się na obrazie. Na przykład, nie wydają się być dwie grupy wokół Hello World
i dwa wokół Some more sample text
Pytanie W scenariuszach, takich jak te w jaki sposób mogę utrzymać możliwie najszersze pole poprzez połączenie dwóch pól. W przypadku tych przykładów zaczynały się od H
, a kończąc na d
, tak aby obejmowały Hello World
. Moim powodem do zrobienia jest to, że chciałbym przyciąć część tego obrazu i wysłać go do tesseract.
Oto odpowiedni kod, który rysuje pola.
void groups_draw(Mat &src, vector<Rect> &groups)
{
for (int i=(int)groups.size()-1; i>=0; i--)
{
if (src.type() == CV_8UC3)
rectangle(src,groups.at(i).tl(),groups.at(i).br(),Scalar(0, 255, 255), 2, 8);
}
}
Oto, co próbowałem. Moje pomysły są w komentarzach.
void groups_draw(Mat &src, vector<Rect> &groups)
{
int previous_tl_x = 0;
int previous_tl_y = 0;
int prevoius_br_x = 0;
int previous_br_y = 0;
//sort the groups from lowest to largest.
for (int i=(int)groups.size()-1; i>=0; i--)
{
//if previous_tl_x is smaller than current_tl_x then keep the current one.
//if previous_br_x is smaller than current_br_x then keep the current one.
if (src.type() == CV_8UC3) {
//crop the image
Mat cropedImage = src(Rect(Point(groups.at(i).tl().x, groups.at(i).tl().y),Point(groups.at(i).br().x, groups.at(i).br().y)));
imshow("cropped",cropedImage);
waitKey(-1);
}
}
}
Aktualizacja
Próbuję użyć [groupRectangles][4]
do osiągnięcia tego celu:
void groups_draw(Mat &src, vector<Rect> &groups)
{
vector<Rect> rects;
for (int i=(int)groups.size()-1; i>=0; i--)
{
rects.push_back(groups.at(i));
}
groupRectangles(rects, 1, 0.2);
}
Jednak to daje mi błąd:
textdetection.cpp:106:5: error: use of undeclared identifier 'groupRectangles'
groupRectangles(rects, 1, 0.2);
^
1 error generated.
Jakie jest twoje pytanie? – 1201ProgramAlarm