2013-02-13 8 views
7

個別の尺度を抽出する方法を知りたいと思います。私はこのアルゴリズムが既に存在するかどうかはわかりませんので、左から右に向かって楽譜をスキャンし、上下の線からすべての空白を抽出してみましょう。楽譜から各行の尺度を抽出する

私は、楽譜をMusicXMLに変換したり、その他の有用な情報を抽出する方法を探していません。いいえ、本質的に私が扱っているのは正規の文書です。私は段落を分ける必要があります。私は、段落で伝えられた情報には興味を持っていませんが、単に文書の領域とは別にチャンクするだけです。この場合、パラグラフは1行のメジャーになります。私は個々の尺度は必要ありませんが、楽譜の各ラインですべての尺度が必要です。

enter image description here

これは、私は、あなたがPDFファイルで楽譜を持っていると仮定すると、私は完全な楽譜からではなく、タイトルなしで希望の出力の1、作曲など enter image description here

+1

スタッフの上/下のメモも必要ですか?時々それらは少しもつれて得ることができる。 – Hannele

+2

「個別の措置を抽出する」とはどういう意味ですか?音楽用語ではありません。 – EJP

+1

直接答えはありませんが、 'python sheet music ocr'のgoogleingは別のスタック質問につながります:: http://stackoverflow.com/questions/675077/ocr-for-sheet-music ::あなたに役立つかもしれません – pyInTheSky

答えて

4

でしょうですApache PDFBoxを使用して、楽譜を含む入力PDFファイルから画像を取得し、必要なバー全体の座標を特定し、選択した画像を使用して画像をトリミングし、目的の結果が得られるまで操作します。

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 */); 
       } 
      } 
} 

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); 
    } 

} 

は今、あなたが使用できる作物のイメージに:

this pageで提供されています
/** 
    * 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); 
     } 
    } 

project

を見て、PDFファイル内の画像を解析するために、他のオプションがありat this code特別にthis

+0

なぜこの答えが完全にユーザーの質問に答えることができません選択されているか分かりません。 –

関連する問題