2014-12-15 9 views
10

Ciao, quello che sto cercando di trovare è un modo per ottenere la giusta scala di testo per un ROI. Il valore della scala deve essere controllato anche dalla dimensione in cui verrà inserito il testo.OpenCV trova il testo Scala da una dimensione

In parole semplici quello che sto cercando di trovare è la funzione "getTextScale" o qualcosa di simile:

std::String text = "Huhu"; 
int fontface = cv::FONT_HERSHEY_PLAIN; 
int thickness = 2; 
int baseline = 0; 
cv::Size sz(500,200); 
double fontScale = cv::getTextScale(text, fontFace, thickness, &baseline,sz); 

Dopo questo calcolo cv :: getTextSize (testo, fontface, fontScale, spessore, & basale) ; recupererebbe valori simili a sz. Ha questa caratteristica?

--EDIT--

ho scoperto che il cv :: getTextSize in OpenCV appare come segue:

Size getTextSize(const string& text, int fontFace, double fontScale, int thickness, int* _base_line) 
{ 
    Size size; 
    double view_x = 0; 
    const char **faces = cv::g_HersheyGlyphs; 
    const int* ascii = getFontData(fontFace); 

    int base_line = (ascii[0] & 15); 
    int cap_line = (ascii[0] >> 4) & 15; 
    size.height = cvRound((cap_line + base_line)*fontScale + (thickness+1)/2); 

    for(int i = 0; text[i] != '\0'; i++) 
    { 
     int c = (uchar)text[i]; 
     Point p; 

     if(c >= 127 || c < ' ') 
      c = '?'; 

     const char* ptr = faces[ascii[(c-' ')+1]]; 
     p.x = (uchar)ptr[0] - 'R'; 
     p.y = (uchar)ptr[1] - 'R'; 
     view_x += (p.y - p.x)*fontScale; 
    } 

    size.width = cvRound(view_x + thickness); 
    if(_base_line) 
     *_base_line = cvRound(base_line*fontScale + thickness*0.5); 
    return size; 
} 

Looks per me ora come per magia, ma forse qualcuno capisce questo codice meglio di me.

--edit 2--

Ora ho scritto la funzione getTextScalefromheight e soddisfa le mie esigenze:

double getTextScalefromheight(int fontFace, int thickness, int height) 
{ 

    Size size; 
    double view_x = 0; 
    const char **faces = g_HersheyGlyphs; 
    const int* ascii = getFontData(fontFace); 

    int base_line = (ascii[0] & 15); 
    int cap_line = (ascii[0] >> 4) & 15; 

    double fontScale = static_cast<double>(height - static_cast<double>((thickness + 1))/2.0)/static_cast<double>(cap_line + base_line); 

    return fontScale; 

} 

Come la percentuale di testo non può essere modificato in OpenCV è questa soluzione in la mia opinione è ok (ho dovuto ridefinire g_HersheyGlyphs e getFontData da fonti opencv prese dal file drawing.cpp).

+0

Stai cercando di montare un testo in una specifica dimensione? vale 500x200? –

+0

Se sì, puoi semplicemente campionare due bilance e calcolare fino a che punto è ridimensionato in termini di pixel. Ora puoi calcolare lo Scaling desiderato per una determinata dimensione dell'immagine! –

+0

Quindi il tuo input è una ROI e un Font e vuoi trovare la scala massima per posizionare il testo in una singola riga a quella ROI? – Micka

risposta

0

La mia soluzione è quella di utilizzare la seguente funzione:

double getTextScalefromheight(int fontFace, int thickness, int height) 
{ 

    Size size; 
    double view_x = 0; 
    const char **faces = g_HersheyGlyphs; 
    const int* ascii = getFontData(fontFace); 

    int base_line = (ascii[0] & 15); 
    int cap_line = (ascii[0] >> 4) & 15; 

    double fontScale = static_cast<double>(height - static_cast<double>((thickness + 1))/2.0)/static_cast<double>(cap_line + base_line); 

    return fontScale; 

} 
Problemi correlati