ฉันจะใช้ tesseract และ opencv เพื่อแยกข้อความจากกล้องได้อย่างไร

ฉันใช้ tesseract 3.02 และ opencv เพื่อให้ tesseract จดจำข้อความจากกล้องแบบเรียลไทม์

แต่ผลที่ได้ค่อนข้างแย่ อ่านผลลัพธ์ไม่ได้และไม่สามารถแสดงภาพได้คล่อง ฉันคิดว่ามันเป็นปัญหาของรหัสของฉัน

ใครสามารถให้คำแนะนำเกี่ยวกับวิธีการแก้ไขได้หรือไม่?

ขอบคุณมาก!

#include "stdafx.h"
#include <string>
#include <opencv2/opencv.hpp>
#include <time.h>


using namespace std;
using namespace cv;


int main() {

    // [1]
    tesseract::TessBaseAPI *myOCR = 
            new tesseract::TessBaseAPI();

    // [2]
    printf("Tesseract-ocr version: %s\n",
           myOCR->Version());
    printf("Leptonica version: %s\n",
           getLeptonicaVersion());

    // [3]
    if (myOCR->Init(NULL, "eng")) {
      fprintf(stderr, "Could not initialize tesseract.\n");
      exit(1);
    }

    //声明IplImage指针
    IplImage* pFrame = NULL;

    //获取摄像头
    CvCapture* pCapture = cvCreateCameraCapture(-1);

    //创建窗口
    cvNamedWindow("video", 1);

    //显示视屏
            time_t last_time = time(NULL);
    while(1)
    {

        pFrame=cvQueryFrame( pCapture );
        if(!pFrame)    break;
        cvShowImage("video",pFrame);
        char c=cvWaitKey(33);
        if(c==27)break;

                time_t this_time = time(NULL);
                if(this_time != last_time)
                {
                    last_time = this_time;
        myOCR->SetRectangle(0,0,pFrame->width,pFrame->height);
        myOCR->SetImage((uchar*)pFrame->imageData,pFrame->width,pFrame-   >height,pFrame->depth/8,pFrame->width*(pFrame->depth/8));
        myOCR->Recognize(NULL);
        const char* out = myOCR->GetUTF8Text();
        printf("%s\n",out);
                }

    }
    cvReleaseCapture(&pCapture);
    cvDestroyWindow("video");
    cv::waitKey(-1);
            return 0;
}

person user1866046    schedule 26.12.2012    source แหล่งที่มา


คำตอบ (1)


Tesseract ได้รับการออกแบบมาเพื่อประมวลผลหนังสือที่สแกน ทำงานบนหน้าสีขาวซึ่งมีเพียงข้อความสีดำ มองเห็นได้ชัดเจนโดยมีการบิดเบือนน้อยที่สุด รูปภาพส่วนใหญ่เป็นขาวดำ รูปภาพของคุณอยู่ในระดับสีเทา ดังนั้น Tesseract จะทำงานได้แย่มาก ไม่ใช่ปัญหาของรหัสของคุณ แต่เป็นของ Tesseract หากคุณหันกล้องไปทางหนังสือ คุณจะสามารถรับข้อความได้ (สมมติว่ารูปภาพถูกโฟกัส) แต่ถ้าคุณต้องการอ่านข้อความทั่วไป (เช่น ป้ายถนน โลโก้บนเสื้อยืดของใครบางคน ก็ไม่มีทางทำได้ . ขออภัยที่ทำให้คุณผิดหวัง

อย่างไรก็ตาม หากคุณต้องการจดจำข้อความเฉพาะ เช่น หมายเลขบัตรเครดิตหรือป้ายถนน คุณก็สามารถทำได้

  1. เริ่มต้นด้วยการหยิบรูปภาพข้อความของคุณหลายๆ รูป
  2. ประมวลผลภาพล่วงหน้าเล็กน้อย แปลงเป็น BW
  3. ฝึก Tesseract ในหลาย ๆ ตัวอย่าง

แล้วมันก็จะสามารถทำภารกิจของคุณให้สำเร็จได้

person DanielHsH    schedule 27.12.2012
comment
ขอบคุณสำหรับข้อมูล. การจดจำข้อความจากหนังสือก็เป็นเรื่องปกติสำหรับฉันเช่นกัน แต่ฉันไม่เพียงแต่ประสบปัญหาเรื่องความแม่นยำเท่านั้น ปัญหาอีกประการหนึ่งคือไม่สามารถแสดงภาพได้อย่างราบรื่น ความล่าช้านั้นร้ายแรงมาก ฉันเดาว่าอาจเป็นเพราะฉันแสดงทุกเฟรม ฉันต้องการทราบวิธีการทำให้เสถียร? ฉันควรจะจับภาพหน้าจอหรืออะไร? ฉันแค่อยากให้มันแสดงข้อความที่กล้องของฉันชี้ไป ดังนั้นฉันเดาว่ารหัสของฉันยังคงมีปัญหาอยู่บ้าง - person user1866046; 27.12.2012
comment
ฉันเข้าใจสิ่งที่คุณพูด คุณต้อง - person DanielHsH; 27.12.2012
comment
ฉันเข้าใจสิ่งที่คุณพูด คุณต้องเรียกใช้อัลกอริธึมป้องกันภาพสั่นไหว (จับคู่ภาพที่ต่อเนื่องกัน) จาก tesseract คุณสามารถรับกล่อง (ตำแหน่งของตัวอักษรแต่ละตัวบนภาพ) จากนั้นคุณรันมันหนึ่งครั้งใน 1[วินาที] เก็บกล่องแล้ววาดตามการเคลื่อนไหวของกล้อง - person DanielHsH; 27.12.2012
comment
ฉันได้ลองแล้ว แต่ไม่สามารถแก้ปัญหาการจดจำได้ ฉันหันกล้องไปที่หนังสือแต่ก็ยังอ่านไม่ออก ฉันจะโพสต์รหัสของฉันอีกครั้ง คุณช่วยฉันตรวจสอบว่ามีอะไรผิดปกติหรือไม่? นั่นจะเป็นประโยชน์มาก ขอบคุณมาก! - person user1866046; 03.01.2013