diff options
Diffstat (limited to 'wizard.cpp')
-rw-r--r-- | wizard.cpp | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/wizard.cpp b/wizard.cpp index ef4941f..e4b79e6 100644 --- a/wizard.cpp +++ b/wizard.cpp | |||
@@ -9,6 +9,7 @@ | |||
9 | #include <tuple> | 9 | #include <tuple> |
10 | #include <random> | 10 | #include <random> |
11 | #include <set> | 11 | #include <set> |
12 | #include <memory> | ||
12 | #include <hkutil/string.h> | 13 | #include <hkutil/string.h> |
13 | #include <tesseract/baseapi.h> | 14 | #include <tesseract/baseapi.h> |
14 | #include <leptonica/allheaders.h> | 15 | #include <leptonica/allheaders.h> |
@@ -265,6 +266,32 @@ Magick::Image downloadImage(const std::string& url) | |||
265 | 266 | ||
266 | 267 | ||
267 | 268 | ||
269 | class tesseract_deleter { | ||
270 | public: | ||
271 | |||
272 | void operator()(tesseract::TessBaseAPI* ptr) const | ||
273 | { | ||
274 | ptr->End(); | ||
275 | } | ||
276 | }; | ||
277 | |||
278 | using tesseract_ptr = | ||
279 | std::unique_ptr<tesseract::TessBaseAPI, tesseract_deleter>; | ||
280 | |||
281 | class pix_deleter { | ||
282 | public: | ||
283 | |||
284 | void operator()(Pix* ptr) const | ||
285 | { | ||
286 | pixDestroy(&ptr); | ||
287 | } | ||
288 | }; | ||
289 | |||
290 | using pix_ptr = std::unique_ptr<Pix, pix_deleter>; | ||
291 | |||
292 | |||
293 | |||
294 | |||
268 | 295 | ||
269 | 296 | ||
270 | int main(int argc, char** argv) | 297 | int main(int argc, char** argv) |
@@ -418,19 +445,19 @@ int main(int argc, char** argv) | |||
418 | Magick::Blob titleBlob; | 445 | Magick::Blob titleBlob; |
419 | titleImg.write(&titleBlob); | 446 | titleImg.write(&titleBlob); |
420 | 447 | ||
421 | Pix* titlePix = pixReadMemTiff( | 448 | pix_ptr titlePix { pixReadMemTiff( |
422 | reinterpret_cast<const unsigned char*>(titleBlob.data()), | 449 | reinterpret_cast<const unsigned char*>(titleBlob.data()), |
423 | titleBlob.length(), | 450 | titleBlob.length(), |
424 | 0); | 451 | 0) }; |
425 | 452 | ||
426 | tesseract::TessBaseAPI* api = new tesseract::TessBaseAPI(); | 453 | tesseract_ptr api { new tesseract::TessBaseAPI() }; |
427 | 454 | ||
428 | if (api->Init(nullptr, "eng")) | 455 | if (api->Init(nullptr, "eng")) |
429 | { | 456 | { |
430 | throw std::runtime_error("Could not initialize tesseract"); | 457 | throw std::runtime_error("Could not initialize tesseract"); |
431 | } | 458 | } |
432 | 459 | ||
433 | api->SetImage(titlePix); | 460 | api->SetImage(titlePix.get()); |
434 | api->Recognize(nullptr); | 461 | api->Recognize(nullptr); |
435 | 462 | ||
436 | tesseract::ResultIterator* ri = api->GetIterator(); | 463 | tesseract::ResultIterator* ri = api->GetIterator(); |
@@ -520,8 +547,7 @@ int main(int argc, char** argv) | |||
520 | 547 | ||
521 | 548 | ||
522 | 549 | ||
523 | api->End(); | 550 | |
524 | pixDestroy(&titlePix); | ||
525 | 551 | ||
526 | if (!firstSlice) | 552 | if (!firstSlice) |
527 | { | 553 | { |