OpenCVSharp を使った画像の切り貼り

OpenCVSharp の導入と,画像の切り貼りについて,調べたのでメモ.

OpenCVSharp の導入

1. Visual Studio 2013 Community のインストール

 個人用なら完全タダで Professional と同等機能を提供!素晴らしい!インストールは素直に下記のリンクから.


2014-Nov 12 Release Notes | Visual Studio


Download Visual Studio Community 2013 というリンクに飛べば,インストーラがダウンロードされる.

2. C# プロジェクトの作成

 Visual Studio 起動後,「ファイル」->「新規作成」->「プロジェクト」->「Visual C#」->「コンソールアプリケーション」とたどり,適当な名前を入力して OK ボタンクリック.

3. OpenCVSharp の導入.

 「ツール」->「Nu Get パッケージマネージャー」->「ソリューションの Nu Get パッケージの管理」->「オンライン」とたどり,検索ボックスに "OpenCVSharp" と入力.OpenCVSharp のパッケージが出てくるので,インストール.ってか,これだけで導入できるなんて,すごい楽ちん.

f:id:rkoichi2001:20160525033507p:plain

OpenCVSharp を使った画像の切り貼り

 複数の画像を集めて,切り貼りして一枚の画像にするという作業が必要になったんだけど,直接画素をいじって編集するというのもなんだかスマートじゃないと思ったのでやり方を調べてみた.やり方としてはそんなに複雑でなく,SetROI 関数を使って対象となるエリアを限定してあげたあとに,Cv.Copy でコピーしてあげれば完了だった.ただ,注意点が一つあり,Cv.Copy やその他の ROI の設定が内部で用いられる関数を呼ぶときには二つの画像の ROI が完全に一致していないといけない.今回の場合だと, targetImage の ROI とコピー元となる whiteImage, grayImage が該当する.以下,簡単にコードの内容をチェック.

1. イメージの生成と画素情報の設定.

 恥ずかしいことに,画面全面で画素情報を設定する方法をしらず,危うく for ループで設定するところだった.こんな時には Cv.Set 関数が役立つ.

// Target Image.
targetImage = new IplImage(new CvSize(500, 500), BitDepth.U8, 1);
// Set the iamge completely black.
Cv.Set(targetImage, new CvScalar(0));

2. ROI の設定と,コピー

 コピーしたい領域を ROI として指定する.そのあとに,Cv.Copy を呼べば OK.SetROI した後の ResetROI のコールを忘れずに!

targetImage.SetROI(new CvRect(100, 100, 100, 100));
Cv.Copy(whiteImage, targetImage);
targetImage.ResetROI();

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using OpenCvSharp;

namespace OpenCVSharpExample
{
    class Program
    {

        public static IplImage targetImage;

        public static IplImage whiteImage;

        public static IplImage grayImage;


        static void Main(string[] args)
        {

            // 1. Image Instance Generation.
            {
                // Target Image.
                targetImage = new IplImage(new CvSize(500, 500), BitDepth.U8, 1);
                // Set the iamge completely black.
                Cv.Set(targetImage, new CvScalar(0));

                whiteImage = new IplImage(new CvSize(100, 100), BitDepth.U8, 1);
                // Set the iamge completely black.
                Cv.Set(whiteImage, new CvScalar(255));

                grayImage = new IplImage(new CvSize(100, 100), BitDepth.U8, 1);
                // Set the iamge completely black.
                Cv.Set(grayImage, new CvScalar(80));
            }

            // 2. Set ROI and Copy
            {
                targetImage.SetROI(new CvRect(100, 100, 100, 100));
                Cv.Copy(whiteImage, targetImage);
                targetImage.ResetROI();

                targetImage.SetROI(new CvRect(300, 300, 100, 100));
                Cv.Copy(grayImage, targetImage);
                targetImage.ResetROI();
            }
            
            Cv.ShowImage("Target Image", targetImage);
            Cv.WaitKey(0);
        }
    }
}


以下,実行結果

f:id:rkoichi2001:20160525040232p:plain