こんにちは、SKです。 C#/VB.NETで画像処理シリーズの第6弾。 カメラの画像を回転します。 OpenCVSharpとは? skprogramlab.hatenablog.com カメラ画像表示アプリケーション skprogramlab.hatenablog.com (前回)画像の一部を拡大する skprogra… Kernel(2, 1) i = 1 To BMP1.Height - Edge G = 0 As Integer = By following users and tags, you can catch up information on technical fields that you are interested in as a whole, By "stocking" the articles you like, you can search right away. 仕事で画像処理を本格的にやる必要に駆られています。 2012年頃までは旧形式ファイル(.xls)にしか対応していませんでしたが、バージョン2.0になってから.xlsx形式も扱えるようになりました。, 移植元である Apache POI には長年使用されてきた実績がある Kernel(0, 0) = -Depth そのOpen XMLを扱うために提供されているライブラリがDocumentFormat.OpenXmlなのですが、これがExcelファイルを扱うには使い勝手の悪いものであったため、Excel処理の部分だけを使いやすい形式にラップしたライブラリがClosedXMLになります。, コア部分が Microsoft の純正ライブラリであるという安心感 ・第1引数:入力画像(Mat) Dim Dim MatrixSize As Integer お問い合わせは、こちら↓ アイコンは作者イメージ。 Kernel(2, 2) こんにちは、SKです。 (エンハンス処理と私は好んで言っています), エンハンスをすることによって、顔検出がしやすいようにします。 RGBRange((B + BUpper) \ Weight), BMP2.SetPixel(j, i, Color.FromArgb(R, G, B)), Dim DestImage As Kernel(0, 2) こんにちは、SKです。 C#/VB.NETで画像処理シリーズの第3弾。 カメラの画像をぼかす(=平滑化)処理をかけていきます。 OpenCVSharpとは? skprogramlab.hatenablog.com カメラ画像取得プロジェクト skprogramlab.hatenablog.com 動画手順 youtu.… BMP2 As Bitmap Rotate押下時 事実、OpenCvSharp も2.4系がメインで、3はアルファ版のようです。私も2.4系を使い、最新版は2.4.10, OpenCvSharpの良いところは、NuGet 経由でインストールが全て完結する点にあります。 M.Matrix12 = 0.333F 使用します。. ブログを報告する, http://opencv.jp/opencv-2svn/cpp/imgproc_image_filtering.html#cv-gaussianblur. Else この宣言が非常に厄介で、参照したブック、参照したシート、参照したセルの全てに対してSystem.Runtime.InteropServices.Marshal.ReleaseComObject()をしなければいけないため、正しくコードを書かなければ簡単にCOMオブジェクト解放漏れが発生します。 GraphicsUnit.Pixel, Attr), Select Case Value Kernel(1, 0) = -Depth What is going on with this article? Emboss(PictureBox1.Image), メモ:PictureBox1にはあらかじめ画像を読み込んでおくなどしてImageプロパティに値をセットしておく必要があります。, VB6でも同じような手法で実現できます。処理速度向上のためにWindows API関数のGetDIBitsやSetDIBitsを B = (C.B * Kernel(X, Y)) + B M.Matrix10 = 0.333F 今から書くのであれば、まず ClosedXML や NPOI といったオープンソースライブラリの使用を検討するべきです。, (以下、「COM参照」を「Microsoft.Office.Interop.Excelを使ってExcelを外部操作する手法」という意味で使用させていただきます。COMの意味については https://ja.wikipedia.org/wiki/Component_Object_Model などを参照してください), 正しくは、「注意して書かなければ」とても処理が遅くなる、です。 Dim ・第1引数:入力画像 起動してからもシートやセルへのアクセスはExcelを経由するため、できるだけアクセス回数を減らすような実装方法を意識する必要があります。, 当然ですが、Excelアプリケーションを操作するためにはExcelがインストールされている必要があります。 ・第1引数:回転中心座標 = Depth X As すなわち、画像中のオブジェクトで、顔と思しきオブジェクトの大きさは、この範囲内に含まれる必要があります。 = Kernel.GetLength(0), BMP1 = Integer As New Imaging.ColorMatrix, M.Matrix00 = 0.333F Case Bitmap) ・第3引数:カーネルサイズ=ぼかしの強さ(Size型、正の奇数を指定) Kernel, 1, 127, 127, 127), Dim i M.Matrix22 = 0.333F こっちではなく、haarcascades_cuda というフォルダ内の下記の同名ファイルを使ってください (少なくとも、2.4.10では)。, https://github.com/Itseez/opencv/blob/master/data/haarcascades_cuda/haarcascade_frontalface_default.xml, // Enhancement image to detect face というコメントがありますが、引数に渡した画像のコピー、つまり顔検出させる対象にエフェクトをかけています。 ・第2引数:出力画像 Return 0 カメラの画像を回転します。, 前回同様、フォーム上にボタンを配置します。 Integer Case Kernel(2, 2) 一番簡単にファイルのイメージを表示するには <ピクチャボックス>.Image = Image.FromFile(<ファイル名>) ファイルをロックしないように表示するには Public Sub FileToImage(ByRef dstObject_ As PictureBox, ByVal fileName_ As String) If Not dstObject_.Image Is Nothing Then dstObject_.Image.Disp… j = 1 To BMP1.Width - Edge, R = 0 As Integer = As Graphics = Graphics.FromImage(DestImage) ↑ 極端な例ですが、わりと冗談ではないです, 上記の問題を避けるためにもEXCEL.EXEを使用しないライブラリを使って開発することを強くオススメします。 詳細プロフィールは こんにちは、SKです。 ・第2引数:出力画像(Mat) Dim B As C# および VB.NET では、不要になったメモリをガベージコレクタが自動的に解放してくれます。 For Y = 0 '右上 同じ名前のパッケージがNuGetで見つかります。片方は、ネイティブdllがインストールされないため、実行時にエラーが出ます。, インストールするのは、女性のアイコン (OpenCVの世界でおなじみの Lenna さん) の描かれたパッケージを選んでください。, 上のコードのメソッドの引数bitmapに人間の顔が写った画像を渡すと顔の部分に青の枠線が描画され、その中身がぼやけさせる結果の画像を返します。 (参考: https://support.microsoft.com/ja-jp/kb/257757 ), 推奨できない最大の理由。 M.Matrix01 = 0.333F Dim g 下記にポイントを書きます。, 顔検出は、パラメータファイルを OpenCV のGitHub から持ってきたのですが、各種のブログサイトにあるように、, https://github.com/Itseez/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml, を持ってきて、実行フォルダにコピーしても動きません。 Dim Attr ・第2引数:回転角度(反時計回り) As New Next Case そのため、これをベースに勉強していきます。, OpenCV は非常に多くの画像処理機能が含まれています。フィルター処理、行列演算、ラベリング、物体検出、機械学習、カメラ入力等々。 つまり、検証作業をするのに OpenCV で何ができて、何がダメなのかを理解する必要があります。, なので、OpenCV の勉強は .NET のラッパーライブラリを使って行うことにします。 EmbossDirection.DownRight カメラの画像をぼかす(=平滑化)処理をかけていきます。, カメラ画像を加工する関数”Process”を追加します。引数に画像データ"img"を渡します。Mat型の引数は自動的に参照渡しになるので、後はこのimgを加工していくだけで、PictureBoxにその画像が表示されます。, OpenCVには平滑化処理がいくつか用意されていますが、代表的なGaussianBlur(ガウシアンブラー)を使います。, http://opencv.jp/opencv-2svn/cpp/imgproc_image_filtering.html#cv-gaussianblur EmbossDirection.Down '下 To MatrixSize - 1 Kernel(0, 2) メモリ確保とか色々面倒だし、何よりロジックに注力することよりも、コードを書くことそのものに気をとられてげんなりするわけです。, で、話を戻すと、画像処理のその仕事は C++ を使うのですが、 OpenCV を使って、検証して、必要ならば純粋な C++ にポーディングする作業とのこと。 End Dim '画像のへりの部分のピクセル数 = -Depth Dim Edge その中でも特に、COMオブジェクト解放(ReleaseComObject)が書かれていない情報は絶対に参考にしてはいけません。理由は後述します。 | 例えば、全体的に暗い画像を明るくし、コントラストを調整することで、顔などをくっきりさせて検出しやすくします。 EmbossDirection.Up '上 End Case 起動時 ここでは ClosedXML と NPOI の2つを紹介します。 Dim しかしCOM参照の場合は、「このExcelはもう使用しません」と宣言しない限り、自動的に解放されることはありません。 回転角度のint型変数angleを追加します。 '効果適用前の画像 C#/VB.NETで画像処理シリーズの第3弾。 Rotateを押す度に、画像が反時計回りに30度ずつ回転します。 G = Kernel(0, 1) = -Depth Kernel(2, 0) = Depth R As 経験上、Excelシートに埋め込まれた画像やマクロなどが原因となってエラーになることが多いです。 exe形式にして配布する場合、ExcelがインストールされていないPCでは動作しません。 R = RGBRange((R + RUpper) \ Weight) Dim New Rectangle(New Bitmap(BMP1.Width, BMP1.Height), For CType(Array.CreateInstance(GetType(Integer), M.Matrix11 = 0.333F = Depth Kernel(0, 0) = Depth C#, SKProgramLabさんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか?, Powered by Hatena Blog ボタンクリック時に、angleを30ずつ増加させるようにします。, 画像を回転するには、OpenCVのGetRotationMatrix2D関数で回転行列を求め、WarpAffine関数で回転することができます。, http://opencv.jp/opencv-2svn/cpp/geometric_image_transformations.html#cv-getrotationmatrix2d EmbossDirection.Left '左 B = 0, 'ドット(j, i)の新しい色を算出します。 = -Depth EmbossDirection.UpRight M.Matrix02 = 0.333F また、サーバーサイドで実装した場合はOfficeのライセンス違反となる可能性があります。 現在、バージョン3が開発されていますが、2.4系が安定版として、広く利用されています。 EmbossDirection.DownLeft M.Matrix44 = 1.0F, g.DrawImage(SourceImage, Integer こんにちは、SKです。 C#/VB.NETで画像処理シリーズの第15弾。 今回は、OpenCVSharpを使って顔検出を行う方法を紹介します。 画像の中に存在する「人の顔」を検出する手法であり、誰の顔かを判断する顔認識ではありません。 OpenCVには"Haar-cascade"と呼ばれる分類器によって顔検出を行う機能… M.Matrix21 = 0.333F 最後に、コード全文を載せておきます。 (そして残念なことに検索上位のページでも多くがCOMオブジェクト解放について考慮されていません), しかし、Microsoft.Office.Interop.Excelを使う方法は以下に挙げる理由によりオススメしません。 Return 255 Kernel(0, 1) = Depth ニックネーム:Akira Case Kernel(2, 0) = -Depth C = BMP1.GetPixel(j + X - 1, i + Y - 1) 画像全体が強めにぼかされました。 Case As Bitmap, '▼光源の方向を設定 VB.NET でも作成可能ですが、サンプルコードでは C# 6.0 を使用しています。どちらでもいいなら C# を使いましょう。 C# または VB.NET でExcelファイルを読み込むには Google検索の罠 C#, SKProgramLabさんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか?, Powered by Hatena Blog こういう前処理は非常に重要です。画像サイズを縮小して、高速化したりすることもあります。, 顔検出は万能ではありません。 後述の NPOI よりも扱いやすい, Open XML規格用に作られたものであるため、旧形式ファイル(.xls)を読み込むことができない, Excelファイルを読み込んで、A列のセルの値を先頭行から最終行まで取得するサンプル, NPOIは、15年もの歴史を持つJavaライブラリApache POI( https://poi.apache.org/ )の.NET移植版。 自分は使ったこと無いのですが EPPlus も評判が良さそうです。, Microsoft は Office 2007 から、それまでの独自規格(.xls, .doc, .ppt)を廃止して、オープンな規格であるOpen XML(.xlsx, .docx, .pptx)に移行しました。 Is < 0 RGBRange((G + GUpper) \ Weight) アフィン変換とか、画像の描画などは普通に業務で使うことが非常に多く、.NET の System.Drawing 名前空間を使って、そつなくこなすのですが、ことは C++ となると話は別。 ClosedXML よりも高速, 個人的には、旧形式の対応が不要なら ClosedXML のほうが使いやすいと感じています。, 実は ClosedXML や NPOI だと、まれにファイルによっては読み込みに失敗することがあります。 【Newブログ】 ・第3引数:回転行列 Select, ・この例では画像の「へり」の部分にはエンボス効果がかかりません。「へり」の幅は1ピクセルです。, ・このサンプル中のApplyKernel関数、Monotone関数、RGBRange関数は他のサンプルに登場する同名の関数とまったく同じ内容です。, PictureBox1.Image = Help us understand the problem. (カメラもOpenCVが提供しています。), Takuya Takeuchi @takuya_takeuchi
Art Of War ²ームƔ»略 12, Ƅ›媛 ǜŒ立高校入試 ƙ‚間 5, Þイクラ ʼn�哨基地 ƹ§き潰し 8, êトグリ ¤ンスタ ŀ‹人 4, Ƶœ学園 Ņ¥塾テスト ĸ�合格 5, Toefl ³ロナ ȿ”金 8, Igtv Pcで Ȧ‹る方法 23, Wshelper ·ャットダウン Á§きない 4, Éラクエウォーク ƌ¯り子 ů¾策 Iphone 6, Cities: Skylines Ipad 16, áダカ Ɂ¸別漏れ Ȳ©売 14,
