OpenCV Python YAML persistance

I wasn't able to find online a complete example on how to persist OpenCV matrices in Python (so really NumPy arrays) to YAML like what cv::FileStorage will give you.

So here's a short snippet:

import numpy as np
import yaml

# A yaml constructor is for loading from a yaml node.
# This is taken from: http://stackoverflow.com/a/15942429
def opencv_matrix_constructor(loader, node):
    mapping = loader.construct_mapping(node, deep=True)
    mat = np.array(mapping["data"])
    mat.resize(mapping["rows"], mapping["cols"])
    return mat
yaml.add_constructor(u"tag:yaml.org,2002:opencv-matrix", opencv_matrix_constructor)

# A yaml representer is for dumping structs into a yaml node.
# So for an opencv_matrix type (to be compatible with c++'s FileStorage) we save the rows, cols, type and flattened-data
def opencv_matrix_representer(dumper, mat):
    mapping = {'rows': mat.shape[0], 'cols': mat.shape[1], 'dt': 'd', 'data': mat.reshape(-1).tolist()}
    return dumper.represent_mapping(u"tag:yaml.org,2002:opencv-matrix", mapping)
yaml.add_representer(np.ndarray, opencv_matrix_representer)


#example
with open('output.yaml', 'w') as f:
    f.write("%YAML:1.0")
    yaml.dump({"a matrix": np.zeros((10,10)), "another_one": np.zeros((2,4))}, f)

#   a matrix: !!opencv-matrix
#     cols: 10
#     data: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
#       0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
#       0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
#       0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
#       0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
#       0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
#       0.0, 0.0, 0.0, 0.0, 0.0]
#     dt: d
#     rows: 10
#   another_one: !!opencv-matrix
#     cols: 4
#     data: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
#     dt: d
#     rows: 2

with open('output.yaml', 'r') as f:
    print yaml.load(f)
  
#  {'a matrix': array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
#         [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
#         [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
#         [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
#         [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
#         [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
#         [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
#         [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
#         [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
#         [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]]), 'another_one': array([[ 0.,  0.,  0.,  0.],
#         [ 0.,  0.,  0.,  0.]])}

There you go

Share

Simple Loading Spinner Tapestry 5 Mixin w/ spin.js

Sharing a small snippet on creating a loading spinner in a Tapestry 5.3+ Mixin, using spin.js.
It creates a convenient way to add spinners to your long-loading-times ajax zone updates, with all the code hidden away from the template .tml and page class object.

Sorry I can't show a working example, that would entail running a Tapestry application server.
But it's very straightforward, just grab the spin.min.js and the rest falls into place (it also depends on jQuery).

Share

Quickly: How to render a PDF to an image in C++?

Using Poppler, of course!
Poppler is a very useful tool for handling PDF, so I've discovered lately. Having tried both muPDF and ImageMagick's Magick++ and failed, Poppler stepped up to the challenge and paid off.

So here's a small example of how work the API (with OpenCV, naturally):

#include <iostream>
#include <fstream>
#include <sstream>
#include <opencv2/opencv.hpp>
#include <poppler-document.h>
#include <poppler-page.h>
#include <poppler-page-renderer.h>
#include <poppler-image.h>

using namespace cv;
using namespace std;
using namespace poppler;

Mat readPDFtoCV(const string& filename,int DPI) {
    document* mypdf = document::load_from_file(filename);
    if(mypdf == NULL) {
        cerr << "couldn't read pdf\n";
        return Mat();
    }
    cout << "pdf has " << mypdf->pages() << " pages\n";
    page* mypage = mypdf->create_page(0);

    page_renderer renderer;
    renderer.set_render_hint(page_renderer::text_antialiasing);
    image myimage = renderer.render_page(mypage,DPI,DPI);
    cout << "created image of  " << myimage.width() << "x"<< myimage.height() << "\n";

    Mat cvimg;
    if(myimage.format() == image::format_rgb24) {
        Mat(myimage.height(),myimage.width(),CV_8UC3,myimage.data()).copyTo(cvimg);
    } else if(myimage.format() == image::format_argb32) {
        Mat(myimage.height(),myimage.width(),CV_8UC4,myimage.data()).copyTo(cvimg);
    } else {
        cerr << "PDF format no good\n";
        return Mat();
    }
    return cvimg;
}

All you have to do is give it the DPI (say you want to render in 100 DPI) and a filename.
Keep in mind it only renders the first page, but getting the other pages is just as easy.

That's it, enjoy!
Roy.

Share

מאגר שמות ישראליים בעברית - Israeli hebrew names dataset

זהו פוסט ראשון בבלוג בעברית, מאחר והוא דן בנושא שמות ישראליים בעברית. לאחרונה יצא לי להתעסק בכריית שמות מדפי אינטרנט ומהר הבנתי שלא אתקדם הרבה אם לא תהיה לי רשימת מילים שהן למעשה שמות, כדי להפריד בקלות את הטקסט מהשמות.
לא מצאתי רשימה כזו פשוטה, למרות שבאתר מ.י.ל.ה של הטכניון יש לקסיקון די נרחב של מילים בעברים עם טיוג גם לשמות. למרות שאפשר בקלות לדלות משם את השמות עם JAXB על הסכמה של הXML, לא עשיתי זאת מפאת חוסר זמן וקוצר רוח.
אז עשיתי רשימה בעצמי. התחלתי ממאגר שמות שקיים אצלי ופירקתי לשם פרטי ומשפחה באמצעות רווחים, ולאחר מכן התחלתי במלאכת הכרייה שהוסיפה הרבה מאוד שמות למאגר.
לאחר מכן חזרתי למאגר שלי ומניתי את המופעים של כל שם כשם פרטי ושם משפחה, כדי לעזור בכרייה עתידית. כך אפשר למצוא עוד שמות למשל אם לוקחים את המילה שבאה לפני שם משפחה מובהק מאוד.
עם זאת ישנם שמות מאוד מבלבלים מבחינת שיוך לשם פרטי או משפחה, למשל "גל", "שלום", או "ברק". לעומתם שמות מובהקים לכאן או לכאן כמו "אהוד" או "לוי"

בכל מקרה, הנה הרשימה לשימושכם החופשי.
נא לקחת בחשבון שזו רשימה חלקית ביותר, וכן המנייה של השמות חלקית ביותר גם היא.
hebrew_names

This is the first hebrew speaking post on the MTT blog, since it speaks of names in Hebrew. This is also not a translation of the above text, just a preamble to it. I've collected a list of Hebrew first and last names and counted the number of times a name appears as first and last on a private database of names. The result may be useful for someone extracting Hebrew names from the web.

Enjoy!
Roy.

Share

Apache Tapestry 5 Progress Bar with jQuery+Bootstrap [w/code]

Just sharing a code snippet about how to implement a jQuery+Bootstrap progress bar for a background operation in Tapestry 5. There's not a lot to it, but it took me a while and serious digging through the internet to find how to make it work. Essentially it's based on a couple of examples and references I found:

But I simplified things because I don't like the over-design Java can easily make you do...
Continue reading "Apache Tapestry 5 Progress Bar with jQuery+Bootstrap [w/code]"

Share