OpenCVのLogger

OpenCVに、なんとログ出力用のクラスがあります。しかもflannの中にです。伏兵過ぎますね。 ごく簡素な実装なのですが、紹介します。

島の海岸線の長さを推定してみる

この記事はOpenCV Advent Calendar 2015の23日目の記事です。 qiita.com あらかじめ言います。しょぼいです。すみません! 目次 ネタ 手法 海領域の抽出 輪郭抽出 真ん中の輪郭のみを残す 輪郭の長さを求める 輪郭の長さをkmに変換する 北海道の海岸線長 敗…

オンメモリのFileStorage

この記事はOpenCV Advent Calendar 2015の11日目の記事です。 qiita.com 目次 筆者の環境 やりたいこと オンメモリの意義 リファレンス ファイルの場合 ファイルからcv::Algorithmを読み込み ファイルにcv::Algorithmを保存 オンメモリのFileStorage メモリ…

MatAllocatorとGC

この記事はOpenCV Advent Calendar 2015の9日目の記事です。初めてこういうのに参加します。 qiita.com 目次 筆者の環境 ネタ概要 C++/CLIによるラッパークラス メモリ不足になるシーン メモリ使用量を見てみる MatAllocatorを自作する MatAllocatorについて…

OpenCVにおける行列の"掛け算"

OpenCVの行列における演算子 * の意味が、C++とPythonで異なるようですね。はまりそうです。PythonはOpenCVというかnumpyの仕様になりますが。

GZip(Deflate)Streamで圧縮するときはCloseを忘れなく

C#

狭いスコープでusingしておくのは大事だなと再認識。 書いたコード byte[] original = File.ReadAllBytes(@"C:\Windows\explorer.exe"); var memory = new System.IO.MemoryStream(); var gzip = new System.IO.Compression.GZipStream( memory, System.IO.C…

OpenCvSharpをつかう その24 (OpenCV 3.0のラベリング)

ラベリング3度目です。好きですね。露骨に作者の需要が現れています。 OpenCV3.0では、cv::connectedComponents という待望のラベリング(連結成分の抽出)関数が追加されました。 ・OpenCV: Structural Analysis and Shape Descriptors ・New functionality i…

OpenCvSharpをつかう その23 (OpenCV 3.0対応)

またまただいぶ間隔が空いてしまいすみません・・・ 前回の記事(http://schima.hatenablog.com/entry/2014/09/08/220420)で罵詈雑言を浴びせたOpenCV3.0にOpenCvSharpをひとまず対応させました。 NuGet Gallery | OpenCvSharp3 3.0.0.20150823 Release 3.0…

OpenCV3.0alpha 変更点レビュー ~ラッパー開発者の視点から~

OpenCvSharpを3.0alphaに対応させる取り組みを始めました。なりふり構わず書き換え、まずはエラーが止まった段階のがこれです。Release 3.0alpha (08 Sep., 2014) · shimat/opencvsharp · GitHub2.0のときもひどい目にあいましたが、今回も何度くじけそうに…

他プロセスとのメモリのやり取り

別のプログラムを"ライブラリ"として参照できると、プログラミングは楽です。しかし何らかの理由でそうできず、別の実行ファイルとして呼び出す場合があります。そうするとすぐ直面するのが情報のやりとりをどうするかです。今回は、VirtualAllocExで作った…

連番の画像ファイルを動画として扱う

知らなかった・・・ C++ (cv::VideoCapture) cv::VideCaptureにて、Cのprintfの要領でこのようにファイル名を指定すると、連番の画像ファイルを動画ストリームとして扱えます。以下の例では、001.png, 002.png, 003.png ... を順次1フレームとして読み込んで…

System.Windows.Forms.WebBrowser あれこれ備忘録

XcodeでiOS向けOpenCV

わたくし、ゆるやかなアンチマカーで、よってど素人なんですが、かの孫子でも「彼を知り己を知れば百戦殆うからず」と申します。それに携帯端末周りは以前から興味があり、知識を広げるのは悪くないと思いました。色々あって会社からMacBookを買ってもらって…

OpenCvSharpをつかう その22 (Dependency Walker)

NuGetでかなり状況は好転したとは思いますが、少し前まででは OpenCvSharpを使おうと思った人の9割はP/Invokeエラーでつまづき、そのうち7割は脱落 という状態だった、きっとそう思います。これの(Windowsにおける)特効薬がDependency Walkerです。私はこれ…

OpenCV GPUモジュールを試す

せっかくグラボがあるのに腐っていたので、有益なことに使ってみます。OpenCVのcv::gpu名前空間以下にあるGPUモジュールを使い、CUDAの力を確認します。OpenCV 2.4.8です。

OpenCvSharpをつかう その21(C++ API 概要)

OpenCvSharpはもともとC言語のOpenCV 1.0 APIを対象に作っておりました。以来6年経ち、C++ APIが充実し主流になってきたため、そのサポートを進めています。ある程度は仕様が固まってきたので、使い方をご紹介していこうと思います。今回は大まかな概観です…

OpenCVで時間の計測

cv::TickMeter を使いましょう。なんか影の薄いcontribにあります。 cv::TickMeter meter; meter.start(); // 何かの処理 meter.stop(); std::cout << meter.getTimeMilli() << "ms" << std::endl; 定番は以下のような書き方ですが、卒業しましょう。OpenCV…

JavaScriptのコンピュータビジョンライブラリ「jsfeat」を試す

jsfeatは純粋にJavaScriptのみで動作するコンピュータビジョンのライブラリです。以下がプロジェクトのサイトです。いわゆる基本的な画像処理、線形代数、特徴点抽出などなど色々とサポートしており、期待のプロジェクトです。 http://inspirit.github.io/js…

OpenCV(2.4.8)による新しいノイズ除去 ざっくり精度調べ

最近のOpenCVには、以下のような新しいフィルタ処理の関数が追加されています。 cv::fastNlMeansDenoising (photo) cv::adaptiveBilateralFilter (imgproc) この関数がどれくらい使えるものなのか、サクッと試してみました。あまり学術的に正確でないかもし…

OpenCvSharpをつかう 記事一覧

おかげさまで好評いただいている(?)このシリーズ、かなり記事が増えてきました。 各記事にリンクを羅列するとすごく長くなってきたので、記事一覧ページを作っておきます。 その1 準備 その2 画像の読み込み その3 グレースケールに変換 その4 フィルタリ…

OpenCvSharpをつかう その20(ASP.NET MVCで使う Ajax編)

その19 に少し手を加え、Ajaxによりページ遷移なしに結果画像を表示できるようにしてみます。完成形はこちらに置いてみました。自由に動かしてみてください。 http://notiz.flnet.org/CannyWebApp今回は全部がASP.NET MVCの話で、OpenCvSharpの新しい話はあ…

OpenCV C++/IFでボロノイ図・ドロネー図を描く

ボロノイ図・ドロネー図の作成については、大昔からOpenCV C/IFに有りました。C++には無いと思っていたのですが、少し前にいつの間にか有ることを知りました。Cのボロノイ図まわりのAPIは、正直いまだにあまり理解していません。いまひとつ、つかみどころが…

OpenCvSharpをつかう その19(ASP.NET MVCで使う 入門編)

OpenCVをC++ではなくC#(.NET Framework)からわざわざ利用する最大のメリットは何か。単純に言語・開発環境的な理由(書きやすいとか)を挙げる人も多いでしょうが、おそらく本質的に最も大きいのは、.NET Frameworkが持つ膨大なクラスライブラリ・周辺技術等…

OpenCvSharpをつかう その18(ラベリング・改)

この度、ラベリング機能を提供するOpenCvSharp.Blobを、P/Invokeによる実装をやめ、すべてC#(マネージドコード)で実装しなおしました。これは以下の理由からです。 ●特にCvBlobインスタンスの取り回しが悪い。リスト側のCvBlobsが解放されるとCvBlobも解放さ…

OpenCvSharpをつかう その17(NuGetで導入)

前々からの野望だったNuGetパッケージを、このたび公開しました! その1で紹介した方法よりもずっと簡単に使い始めることができるはずです。OpenCVの事前インストールも不要です。まだ作りたてほやほやなので変更されるかもしれませんが、ひとまずの使い方紹…

ImageProcessor を使う

C#

NuGetパッケージに ImageProcessor というライブラリがあります。名前は大仰なのに機能は少ないものの、純粋なC#実装で(GDI+)、簡単にちょっとした画像処理ができるので、使う場面によっては有用だと感じました。以下、ImageProcessor(1.7.1.1)の使い方の紹…

TortoiseGitをGithubの二段階認証に対応

Githubのログインを二段階認証(Two-factor Authentication)に変更したところ、TortoiseGitからpullなどをしようとすると「Authentication failed」するようになってしまいました。これを克服する手順です。

Google APIからGoogle Fusion Tablesに触る

Google Fusion Tablesは、簡単に言うとオンラインで使えるデータベースです。これ、相当すごいと思います。夢広がりまくりです。SQLっぽいクエリを投げて、データを取得したり、追加したりなどなどできます。特にGoogle Mapsとの連携が良くできていますが、…

OpenCvSharpをつかう その16(SVM)

前回の記事に引き続き、SVMです。今回はOpenCvSharpからOpenCVのopencv2/ml.hpp(実装当時はopencv/ml.h)にある機械学習を使います。OpenCvSharpをつかう 記事一覧

RubyでSVMをつかう [rb-libsvm]

近年大人気(?)のSVM[Support Vector Machine]を、Rubyから簡単に使う方法です。SVMのライブラリとしてはlibsvmが著名です。これをRubyから触るためのgemは複数ありますが、ここではrb-libsvmを使いました。環境はDebian wheezy, Rubyのバージョンは1.9.3p19…

積分画像(Integral Image)による、Sauvolaの手法の高速化

先日の記事にて、適応的二値化の一手法であるSauvola[1]の手法について紹介しました。閾値の計算式は単純で、実装は割と簡単です。しかし1ピクセルごとに周囲の平均・標準偏差を求めるのは、結構コストがかかる処理です。これを積分画像(Integral Image)に…

Google Apps Scriptで、Googleカレンダーを調べる

最近個人的にアツいのが、Google Apps Scriptです。Google Docsでオンラインでスクリプトを記述でき、そこで実行してGoogleの様々なサービスにアクセスできたりします。かなり夢が広がります。今後何回か扱っていきたいと思っていますが、まずは簡単な導入の…

OpenCvSharpをつかう その15(適応的閾値処理)

適応的閾値処理 (Adaptive Thresholding) を使うサンプルです。始めからぶっちゃけますと cvAdaptiveThreshold を使え、という話になりますが、本記事はそれだけでは終わりません! OpenCvSharpでは、OpenCV標準では用意されていない適応的閾値処理を、こっ…

ruby-tesseract を使う

このブログ、.NET Frameworkべったりですが、実はわたくし、Ruby歴の方が長いです。 初めてのRuby記事を書きます。フリーのOCRライブラリ「tesseract」をRubyから触れる「ruby-tesseract」の紹介です。Linux(Debian/Ubuntu)という前提です。https://github.c…

OpenCvSharpをつかう その14(Debian wheezyで動かす)

3年ぶりの「OpenCvSharpをつかう」シリーズ再開です! OpenCvSharpをLinuxで動かすことについては、大昔に断片的に書きましたが、最後まで通しで書いてみます。記憶を頼りに書いているので、本当は詰まった箇所が抜けているかもしれません。 その1 その2 そ…

ほげちゃん

今日は本の紹介。この本を知っていますか?ほげちゃん作者: やぎたみこ出版社/メーカー: 偕成社発売日: 2011/06/02メディア: ハードカバー クリック: 5回この商品を含むブログ (15件) を見るあるぬいぐるみのおはなしです。表紙を見ると「なんじゃこりゃ?」…

IntPtr.Add, IntPtr.Subtract

C#

いつの間にこんなメソッドが!.NET Framework 2.0ばかり使っていたので、長いこと気づきませんでした。みんなのつよーい味方、IntPtr構造体に、AddメソッドとSubtractメソッドができていました(どちらもstatic)。また、同じ機能で+と-の演算子としても定義…

はてなダイアリーから移行しました

移行 最近周囲からの再開圧力がほのかに増してきており、2年半ぶりの更新を決意。ついでにはてなブログに移行しました。 手順はすごく簡単です。はてなダイアリーからのリダイレクトまでしてくれます。 http://help.hatenablog.com/entry/import RPGの主人公…

Microsoft Chart Controls を使って東京電力の電力使用状況をグラフ化する

C#

.NET Framework 4から導入されたSystem.Windows.Forms.DataVisualization.Charting名前空間にあるMicrosoft Chart Controlsを使うと、簡単にグラフを作成できます。(.NET Framework 3.5でも、このページから必要なものを落としてきてインストールすれば使え…

MPOファイルのヘッダを解析しJPEGに変換する

C#

ニンテンドー3DSなどステレオ3Dカメラで撮影したMPO画像ファイルについての話の続きです。このファイルはJPEGが単純に複数枚連結したような構成になっており、先日の記事ではファイルの全バイト中からJPEGの開始数バイト(SOIなど)を探索することで切り分け…

スレッドセーフなIOの扱い

C#

マルチスレッドな処理では、複数のスレッドから1つのリソースにアクセスするときがなかなか厄介です。排他処理を行わないとタイミングによってはおかしくなってしまいます。

エンディアンを指定できるBitConverter

C#

バイト配列から任意のプリミティブ型(int, floatなど)に変換するにあたって便利なのがSystem.BitConverterクラスです。しかしこのクラスは自分の環境におけるエンディアンで処理されてしまいます。おそらく多くの環境はリトルエンディアンですが、この場合ビ…

MPOファイルをJPEGに変換する

C#

ステレオ3Dカメラ搭載のニンテンドー3DSが発売になり、これによってステレオ3Dカメラはいくらか普及するのかもしれません。ステレオということでレンズが2つ付いており、それぞれで撮影された複数の画像が .mpo という拡張子のファイルとなってまとめて保存…

.NET Framework(C#)のLogger

C#

どういうわけか今までログについてあまり考えてきませんでしたが、最近少し需要を感じるようになりました。きっと用意されているはず、と調べると案の定いくつかありました。ごく簡単にまとめておきます。

OpenCV 2.2で変更・追加されたもの (C Interface)

C形式の関数・構造体がOpenCV2.1からどれだけ変わったかをまとめておき、ラッパー開発の指針にしようと思います。例によって多分どこか抜けています。また、C++の方はまとめる気はありません。公式の変更点はこちら。実際のところこちらに全て載っています。…

Windows7のVirtual PCにUbuntu 10.04を入れる

以前に [id:Schima:20091111#1257943149] にて、Ubuntu9.10をWindows7のVirtual PCの仮想マシンとしてインストールする方法をまとめました。ところが、Ubuntu10.xになって以降はそう簡単にはインストールできなくなったようです。昔からVirtual PCと(大抵の…

unmanagedクラスにmanagedなメンバを持たせる

以下のコードはビルドできません。「マネージ 'hoge' をアンマネージ 'Native' で宣言できません。」というメッセージが出ます。 class Native { public: StringBuilder^ hoge; }; managedな変数hogeがGCによって移動された場合に、unmanagedなクラスではそ…

WriteableBitmapの画素をポインタから操作する

WPFには様々なビットマップのクラスがあってややこしいですが、System.Windows.Media.Imaging.WriteableBitmapクラスは低レベルな操作ができるので、他の環境とのやり取りもしやすく私好みです。今回はWriteableBitmapの画素値にポインタで直接アクセスしま…

Visual Studio 2010の標準ツールバーにプラットフォーム選択を表示させる

自分の環境では、従来のバージョンでも表示されていましたし、VS2010でも表示されていたと思うのですが、この度OSごと再インストールしたら表示されなくなってしまいました。 以前は下図のように「x86」という部分が表示されていました。ここでプラットフォ…

Roland SK-500 を Windows7 64-bit に導入する

突然の話でしたが、ありがたいことにもらいうけてしまいました。http://www.roland.co.jp/products/dtm/SK-500.htmlドライバは一見Windows 7のものは用意されていないのですが、Vistaのものでなんとかなります。その導入の備忘録です。