#include "minos_search.hpp"
#include <QQmlEngine>
#include <QQmlComponent>
#include <cvb/ui/ui.hpp>
#include <cvb/area_2d.hpp>
#include <cvb/point_2d.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() +
Cvb::String(CVB_LIT(
"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;
}
{
auto searchResult = classifier_.Search(plane, Cvb::Minos::SearchMode::FindFirst, lineAoi);
if (searchResult.Quality() == 0.0)
return;
auto lineStart = searchResult.Position();
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;
SearchLine(plane, nextLineAoi, resultList);
}
{
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