#include "minos_search.hpp"
#include <QQmlComponent>
#include <QQmlEngine>
#include <cvb/area_2d.hpp>
#include <cvb/point_2d.hpp>
#include <cvb/ui/ui.hpp>
const double FIRST_AREA_RADIUS = 8.0;
const double LINE_RADIUS = 4;
const double WORD_HEIGHT = 4;
const double WORD_WIDTH = 4;
const double LINE_STEP_RADIUS = 8;
MinosSearch::MinosSearch(
const Cvb::StreamPtr &stream, MinosResultModel &model)
: QObject(), SingleStreamHandler(stream), stream_(stream),
classifier_(
Cvb::InstallPath() +
"tutorial/Minos/Images/OCR/Training Set/Numbers.clf"))),
model_(model), stopWatch_(
Cvb::StopWatchMode::MultiCPU) {}
MinosSearch::~MinosSearch() { TryFinish(); }
void MinosSearch::StartGrab() { Run(); }
void MinosSearch::StopGrab() { Finish(); }
void MinosSearch::Snap() {
auto waitResult = stream_->GetTimedSnapshot(std::chrono::seconds(1));
if (waitResult.Status != Cvb::WaitStatus::Ok)
return;
MinosResultData result;
stopWatch_.Start();
result.List = Search(waitResult.Image->Plane(0));
model_.SetProcessingTime(stopWatch_.TimeSpan().count());
result.Image = waitResult.Image;
model_.PushData(result);
model_.Refresh();
}
std::vector<MinosResultItem> MinosSearch::Search(
const Cvb::ImagePlane &plane) {
auto width =
static_cast<double>(plane.
Parent().Width());
auto height =
static_cast<double>(plane.
Parent().Height());
auto searchResult =
classifier_.Search(plane, Cvb::Minos::SearchMode::FindFirst, searchAoi);
std::vector<MinosResultItem> resultList;
if (searchResult.Quality() < 0.1)
return resultList;
auto position = searchResult.Position();
SearchLine(plane, lineAoi, resultList);
return resultList;
}
std::vector<MinosResultItem> &resultList) {
auto searchResult =
classifier_.Search(plane, Cvb::Minos::SearchMode::FindFirst, lineAoi);
if (searchResult.Quality() == 0.0)
return;
auto lineStart = searchResult.Position();
lineStart.Y() - WORD_HEIGHT / 2),
auto readResult = classifier_.Read(plane, readAoi, OCR_AOI);
for (const auto c : readResult)
stream << c.Name();
MinosResultItem resultItem = {lineStart, stream.str()};
resultList.push_back(resultItem);
lineStart += LINE_STEP;
lineStart.Y() - LINE_STEP_RADIUS),
lineStart.Y() - LINE_STEP_RADIUS),
lineStart.Y() + LINE_STEP_RADIUS));
SearchLine(plane, nextLineAoi, resultList);
}
auto waitResult =
if (waitResult.Status == Cvb::WaitStatus::Ok) {
MinosResultData result;
stopWatch_.Start();
result.List = Search(waitResult.Image->Plane(0));
model_.SetProcessingTime(stopWatch_.TimeSpan().count());
result.Image = waitResult.Image;
model_.PushData(result);
QMetaObject::invokeMethod(&model_, "Refresh", Qt::QueuedConnection);
}
}
const Image & Parent() const noexcept
std::shared_ptr< Stream > StreamPtr