上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
今回は、Schimaの日記 - ステレオマッチング (cvaux)で紹介・実装されている。
OpenCVSharpでブロックマッチングを自分でも試してみました。

ソース

※処理の肝の部分だけ抜粋しています。


// 入力画像の読み込み
using (IplImage imgLeft = new IplImage("tsukuba_left.png", LoadMode.GrayScale))
using (IplImage imgRight = new IplImage("tsukuba_right.png", LoadMode.GrayScale))
{
    // 出力画像の領域を確保
    using (IplImage dstBM = new IplImage(imgLeft.Size, BitDepth.F32, 1))
    using (IplImage dst = new IplImage(imgLeft.Size, BitDepth.U8, 1))
    using (CvStereoBMState stateBM = new CvStereoBMState(StereoBMPreset.Narrow, 16))
    {
        Cv.FindStereoCorrespondenceBM(imgLeft, imgRight, dstBM, stateBM);
        Cv.ConvertScale(dstBM, dstBM, 16);
        
        Cv.FindStereoCorrespondence(imgLeft, imgRight, DisparityMode.Birchfield, dst, 50, 25, 5, 12, 15, 25);
        Cv.ConvertScale(dst, dst, 16);

        // ウィンドウに表示
        using (CvWindow window = new CvWindow("Stereo Correspondence", dst))
        using (CvWindow windowBM = new CvWindow("Stereo CorrespondenceBM", dstBM))
        {
            Cv.WaitKey();
        }
    }
}




結果

結果は以下のようになります。

【FindStereoCorrespondence】


【FindStereoCorrespondenceBM】
StereoBM.jpg



FindStereoCorrespondenceBMで処理された方の画像が白くなっているのはなぜだろう・・・
FindStereoCorrespondenceでしかされていない処理やアルゴリズム自体の精度の問題があるのかもしれません・・・


画像の形を変換する?
射影変換をやってみることに。。。


まずは、どんなものか感じをつかむために、こちらのサイトの画像をC#で書き直してみました。
OpenCV@Chihara-Lab. 射影変換

計算を自前でやろうとしたのですが、逆行列の計算が中々うまくいかず結局、OpenCvをC#で使用するOpenCvSharpというラッパーを使用しました(;´Д`)
OpenCVをC#やVB.NETなどの.NET Frameworkの言語から利用するためのクロスプラットフォームで動作するラッパーです。とのこと


ソースコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenCvSharp;
using OpenCvSharp.CPlusPlus; 

namespace HomographyOpenCV
{
    class Program
    {
        static void Main(string[] args)
        {
            // 元画像の頂点の座標
            double[] a = new double[]{
                                93, 90,
                                20, 422,
                                501, 468,
                                408, 43
            };

            // 変換先の頂点の座標
            double[] b = new double[]{
                                0, 0,
                                0, 511,
                                511, 511,
                                511, 0
            };
            CvMat Mata = new CvMat(4, 2, MatrixType.F64C1, a);
            CvMat Matb = new CvMat(4, 2, MatrixType.F64C1, b);

            IplImage src = Cv.LoadImage("1.jpg", LoadMode.Color);
            IplImage dst = src.Clone();

            //homography
            CvMat h = new CvMat(3, 3, MatrixType.F64C1);

            Cv.FindHomography(Mata, Matb, h);

            for(int i=0 ; i<3 ;i++)
            {
                for(int j=0; j<3; j++)
                {
                    System.Diagnostics.Debug.WriteLine("h[{0},{1}] = {2}", i,j,h[i,j]);
                }
            }

            Cv.WarpPerspective(src, dst, h);

            using (new CvWindow("src", src))
            using (new CvWindow("dst", dst))
            {
                Cv.WaitKey();
            }

            src.Dispose();
            dst.Dispose();
        }
    }
}


結果

プログラムの結果はこんな感じになりました。
元画像
src.png

変換画像
dst.png

きちんと変換できてるようです。

FC2カウンター
プロフィール

Author:詠み人知らず
プログラム好きな名もなき凡人がお送りしています。(得意とは言っていない
最近の興味はPython、C#、Matlab(Octave)、画像処理、AR(拡張現実)、統計などなど・・・

気分で思いついたことを書くため話題に一貫性がないかもしれません。

カレンダー
08 | 2017/03 | 09
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
最新記事
タグクラウドとサーチ

カテゴリ
最新コメント
最新トラックバック
月別アーカイブ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。