2013-02-13 8 views
7

Vorrei conoscere un modo per estrarre le singole linee di misure. Non sono sicuro che esista già un algoritmo per questo, quindi ho pensato di scansionare uno spartito da sinistra a destra, estrai tutti gli spazi bianchi da sopra e sotto una linea di misure.Estrarre le misure su ciascuna riga da spartiti

Non sto cercando un modo per convertire gli spartiti in MusicXML o estrarre altre informazioni utili. No, in sostanza quello che sto trattando è un documento regolare. Devo separare i paragrafi. Non sono interessato alle informazioni fornite dal paragrafo ma semplicemente separandole separatamente dalle regioni del documento. In questo caso un paragrafo sarebbe una linea di misure. Non ho bisogno di misure individuali ma di tutte le misure su ciascuna linea di spartiti.

enter image description here

Questo è uno dei dell'uscita vorrei dalla musica foglio intero, ma senza il titolo, compositore ed ecc enter image description here

+1

Hai bisogno anche delle note sopra/sotto lo staff? A volte quelli possono diventare un po 'aggrovigliati. – Hannele

+2

Che cosa significa "estrai singola linea di misure"? Non un termine musicale. – EJP

+1

Non una risposta diretta, ma googleing per "python sheet music ocr", mi porta ad un'altra domanda di stack: http://stackoverflow.com/questions/675077/ocr-for-sheet-music :: che può aiutarti – pyInTheSky

risposta

4

Supponendo di avere la partitura in PDF File, avrei utilizzare Apache PDFBox per ottenere immagini da un file PDF di input contenente gli spartiti, quindi individuare le coordinate dell'intera barra di cui si ha bisogno, con un'immagine selezionata definire le coordinate per ritagliare l'immagine e manipolarla fino ad ottenere il risultato desiderato.

PDDocument document = null; 
document = PDDocument.load(inFile); 
List pages = document.getDocumentCatalog().getAllPages(); 
Iterator iter = pages.iterator(); 
while (iter.hasNext()) { 
      PDPage page = (PDPage) iter.next(); 
      PDResources resources = page.getResources(); 
      Map pageImages = resources.getImages(); 
      if (pageImages != null) { 
       Iterator imageIter = pageImages.keySet().iterator(); 
       while (imageIter.hasNext()) { 
        String key = (String) imageIter.next(); 
        PDXObjectImage image = (PDXObjectImage) pageImages.get(key); 
        image.write2OutputStream(/* some output stream */); 
       } 
      } 
} 

Ecco un codice di esempio disponibile in Apache PDFBox.

import java.io.File; 
import java.io.IOException; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 

import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.PDResources; 
import org.apache.pdfbox.pdmodel.encryption.AccessPermission; 
import org.apache.pdfbox.pdmodel.encryption.StandardDecryptionMaterial; 
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObject; 
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm; 
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage; 

/** 
* This will read a read pdf and extract images. <br/><br/> 
* 
* usage: java org.apache.pdfbox.ExtractImages &lt;pdffile&gt; &lt;password&gt; [imageprefix] 
* 
* @author <a href="mailto:[email protected]">Ben Litchfield</a> 
* @version $Revision: 1.7 $ 
*/ 
public class ExtractImages 
{ 
    private int imageCounter = 1; 

    private static final String PASSWORD = "-password"; 
    private static final String PREFIX = "-prefix"; 
    private static final String ADDKEY = "-addkey"; 
    private static final String NONSEQ = "-nonSeq"; 

    private ExtractImages() 
    { 
    } 

    /** 
    * This is the entry point for the application. 
    * 
    * @param args The command-line arguments. 
    * 
    * @throws Exception If there is an error decrypting the document. 
    */ 
    public static void main(String[] args) throws Exception 
    { 
     ExtractImages extractor = new ExtractImages(); 
     extractor.extractImages(args); 
    } 

    private void extractImages(String[] args) throws Exception 
    { 
     if(args.length < 1 || args.length > 4) 
     { 
      usage(); 
     } 
     else 
     { 
      String pdfFile = null; 
      String password = ""; 
      String prefix = null; 
      boolean addKey = false; 
      boolean useNonSeqParser = false; 
      for(int i=0; i<args.length; i++) 
      { 
       if(args[i].equals(PASSWORD)) 
       { 
        i++; 
        if(i >= args.length) 
        { 
         usage(); 
        } 
        password = args[i]; 
       } 
       else if(args[i].equals(PREFIX)) 
       { 
        i++; 
        if(i >= args.length) 
        { 
         usage(); 
        } 
        prefix = args[i]; 
       } 
       else if(args[i].equals(ADDKEY)) 
       { 
        addKey = true; 
       } 
       else if(args[i].equals(NONSEQ)) 
       { 
        useNonSeqParser = true; 
       } 
       else 
       { 
        if(pdfFile == null) 
        { 
         pdfFile = args[i]; 
        } 
       } 
      } 
      if(pdfFile == null) 
      { 
       usage(); 
      } 
      else 
      { 
       if(prefix == null && pdfFile.length() >4) 
       { 
        prefix = pdfFile.substring(0, pdfFile.length() -4); 
       } 

       PDDocument document = null; 

       try 
       { 
        if (useNonSeqParser) 
        { 
         document = PDDocument.loadNonSeq(new File(pdfFile), null, password); 
        } 
        else 
        { 
         document = PDDocument.load(pdfFile); 

         if(document.isEncrypted()) 
         { 
          StandardDecryptionMaterial spm = new StandardDecryptionMaterial(password); 
          document.openProtection(spm); 
         } 
        } 
        AccessPermission ap = document.getCurrentAccessPermission(); 
        if(! ap.canExtractContent()) 
        { 
         throw new IOException(
          "Error: You do not have permission to extract images."); 
        } 

        List pages = document.getDocumentCatalog().getAllPages(); 
        Iterator iter = pages.iterator(); 
        while(iter.hasNext()) 
        { 
         PDPage page = (PDPage)iter.next(); 
         PDResources resources = page.getResources(); 
         // extract all XObjectImages which are part of the page resources 
         processResources(resources, prefix, addKey); 
        } 
       } 
       finally 
       { 
        if(document != null) 
        { 
         document.close(); 
        } 
       } 
      } 
     } 
    } 

    private void processResources(PDResources resources, String prefix, boolean addKey) throws IOException 
    { 
     if (resources == null) 
     { 
      return; 
     } 
     Map<String, PDXObject> xobjects = resources.getXObjects(); 
     if(xobjects != null) 
     { 
      Iterator<String> xobjectIter = xobjects.keySet().iterator(); 
      while(xobjectIter.hasNext()) 
      { 
       String key = xobjectIter.next(); 
       PDXObject xobject = xobjects.get(key); 
       // write the images 
       if (xobject instanceof PDXObjectImage) 
       { 
        PDXObjectImage image = (PDXObjectImage)xobject; 
        String name = null; 
        if (addKey) 
        { 
         name = getUniqueFileName(prefix + "_" + key, image.getSuffix()); 
        } 
        else 
        { 
         name = getUniqueFileName(prefix, image.getSuffix()); 
        } 
        System.out.println("Writing image:" + name); 
        image.write2file(name); 
       } 
       // maybe there are more images embedded in a form object 
       else if (xobject instanceof PDXObjectForm) 
       { 
        PDXObjectForm xObjectForm = (PDXObjectForm)xobject; 
        PDResources formResources = xObjectForm.getResources(); 
        processResources(formResources, prefix, addKey); 
       } 
      } 
     } 
    } 

    private String getUniqueFileName(String prefix, String suffix) 
    { 
     String uniqueName = null; 
     File f = null; 
     while(f == null || f.exists()) 
     { 
      uniqueName = prefix + "-" + imageCounter; 
      f = new File(uniqueName + "." + suffix); 
      imageCounter++; 
     } 
     return uniqueName; 
    } 

    /** 
    * This will print the usage requirements and exit. 
    */ 
    private static void usage() 
    { 
     System.err.println("Usage: java org.apache.pdfbox.ExtractImages [OPTIONS] <PDF file>\n" + 
      " -password <password>  Password to decrypt document\n" + 
      " -prefix <image-prefix>  Image prefix(default to pdf name)\n" + 
      " -addkey      add the internal image key to the file name\n" + 
      " -nonSeq      Enables the new non-sequential parser\n" + 
      " <PDF file>     The PDF document to use\n" 
      ); 
     System.exit(1); 
    } 

} 

Ora ritaglio immagine per è possibile utilizzare:

/** 
    * Crop the main image according to this rectangle, and scale it to the 
    * correct size for a thumbnail. 
    */ 
    public InputStream cropAndScale(InputStream mainImageStream, 
      CropRectangle crop) { 
     try { 
      RenderedOp mainImage = loadImage(mainImageStream); 
      RenderedOp opaqueImage = makeImageOpaque(mainImage); 
      RenderedOp croppedImage = cropImage(opaqueImage, crop); 
      RenderedOp scaledImage = scaleImage(croppedImage); 
      byte[] jpegBytes = encodeAsJpeg(scaledImage); 
      return new ByteArrayInputStream(jpegBytes); 
     } catch (Exception e) { 
      throw new IllegalStateException("Failed to scale the image", e); 
     } 
    } 

che è disponibile in this page e project

C'è altra opzione per analizzare le immagini all'interno di un file pdf, uno sguardo at this code specialmente this

+0

non so perché questa risposta è stata selezionata in quanto non risponde completamente alla domanda degli utenti. –

Problemi correlati