IplImage 相互変換

Classes

ClassDescription
Public classIplImageConverter
IplImage 相互変換クラス

Structures

StructureDescription
Public structureIplImageSize
画像サイズ情報構造体

Remarks

Intel IPL の IplImage との相互変換の為の定義を集約するネームスペースです。

ここに集約された機能は、主に OpenCV との相互運用を行う方を対象にしています。
例えば、下記のようなケースです。

  • ビデオ入力や画像表示機能は WIL を使用し、画像処理機能は OpenCV を使用する。
  • 画像フィルタは OpenCV を使用し、画像計測は WIL を使用する。

このようなケースでは画像オブジェクトの相互変換が必要になりますので、 OpenCV で使用している IplImage の互換形式の構造体を介して変換処理を簡素化することが目的です。

尚、OpenCV や Intel IPL の使用方法については、弊社ではサポートできませんのでご了承ください。

Examples

本ライブラリの関数の使用方法を説明する為に OpenCV を使用したサンプルコードを記載しています。
コンパイルするには OpenCV の関数の宣言(DllImport)や構造体・定数の定義をユーザー側で行う必要があります。
下記に本ライブラリのサンプルコードをコンパイルする為に必要な最低限のコードを記載します。
尚、実行するには OpenCV の DLL が必要になります。
本書では OpenCV 2.4.5 の下記の DLL を使用しています。

  • opencv_core245.dll
  • opencv_highgui245.dll

トピック:

C#:

関数の宣言:
C# Copy imageCopy
// $Revision: 1.6 $

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace SampleCode.Ipl
{
    partial class Converter
    {
        /// <summary>
        /// 画像オブジェクトの生成.
        /// </summary>
        /// <param name="size">幅と高さ</param>
        /// <param name="depth">ピクセルの型 [IPL_DEPTH.IPL_DEPTH_8U,_16U,_16S,_32S,_32F,_64F]</param>
        /// <param name="channels">チャネル数 [1~4]</param>
        /// <returns>
        ///        ヒープに確保された IplImage 構造体のアドレスを返します.
        /// </returns>
        [DllImport("opencv_core245.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr cvCreateImage(CvSize size, int depth, int channels);

        /// <summary>
        /// 画像オブジェクトの生成.
        /// </summary>
        /// <param name="size">幅と高さ</param>
        /// <param name="depth">ピクセルの型 [IPL_DEPTH.IPL_DEPTH_8U,_16U,_16S,_32S,_32F,_64F]</param>
        /// <param name="channels">チャネル数 [1~4]</param>
        /// <returns>
        ///        ヒープに確保された IplImage 構造体のアドレスを返します.
        /// </returns>
        [DllImport("opencv_core245.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr cvCreateImage(CvSize size, IPL_DEPTH depth, int channels);

        /// <summary>
        /// 画像オブジェクトの解放.
        /// </summary>
        /// <param name="image">確保した IplImage 構造体へのポインタ</param>
        [DllImport("opencv_core245.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        private static extern void cvReleaseImage(ref IntPtr image);

        /// <summary>
        /// 画像オブジェクトヘッダーの生成.
        /// </summary>
        /// <param name="size">幅と高さ</param>
        /// <param name="depth">ピクセルの型 [IPL_DEPTH.IPL_DEPTH_8U,_16U,_16S,_32S,_32F,_64F]</param>
        /// <param name="channels">チャネル数 [1~4]</param>
        /// <returns>
        ///        ヒープに確保された IplImage 構造体のアドレスを返します.
        /// </returns>
        [DllImport("opencv_core245.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr cvCreateImageHeader(CvSize size, int depth, int channels);

        /// <summary>
        /// 画像オブジェクトヘッダーの生成.
        /// </summary>
        /// <param name="size">幅と高さ</param>
        /// <param name="depth">ピクセルの型 [IPL_DEPTH.IPL_DEPTH_8U,_16U,_16S,_32S,_32F,_64F]</param>
        /// <param name="channels">チャネル数 [1~4]</param>
        /// <returns>
        ///        ヒープに確保された IplImage 構造体のアドレスを返します.
        /// </returns>
        [DllImport("opencv_core245.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr cvCreateImageHeader(CvSize size, IPL_DEPTH depth, int channels);

        /// <summary>
        /// 画像オブジェクトヘッダーの解放.
        /// </summary>
        /// <param name="image">確保した IplImage 構造体へのポインタ</param>
        [DllImport("opencv_core245.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        private static extern void cvReleaseImageHeader(ref IntPtr image);

        /// <summary>
        /// 画像ファイルの読み込み.
        /// </summary>
        /// <param name="filename">ファイル名称</param>
        /// <param name="flags">読み込み方法を指示するフラグ</param>
        /// <returns>
        ///        ヒープに確保された IplImage 構造体のアドレスを返します.
        /// </returns>
        [DllImport("opencv_highgui245.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        private static extern IntPtr cvLoadImage(string filename, CV_LOAD_IMAGE flags);

        /// <summary>
        /// 画像ファイルの保存.
        /// </summary>
        /// <param name="filename">ファイル名称</param>
        /// <param name="image">IplImage 構造体のアドレス</param>
        /// <param name="param">保存方法を指示するパラメータ</param>
        /// <returns>
        /// </returns>
        [DllImport("opencv_highgui245.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        private static extern int cvSaveImage(string filename, IntPtr image, int[] param);
    }
}

[↑戻る]


定数の定義:
C# Copy imageCopy
// $Revision: 1.2 $

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace SampleCode.Ipl
{
    /// <summary>
    /// 画像ファイル読み込み方法を指示するフラグ.
    /// </summary>
    [Flags]
    enum CV_LOAD_IMAGE
    {
        CV_LOAD_IMAGE_GRAYSCALE = 0,
        CV_LOAD_IMAGE_COLOR = 1,
        CV_LOAD_IMAGE_ANYDEPTH = 2,
        CV_LOAD_IMAGE_ANYCOLOR = 4,
    }

    /// <summary>
    /// 画像ファイル保存方法を指示するフラグ.
    /// </summary>
    enum CV_IMWRITE
    {
        CV_IMWRITE_JPEG_QUALITY = 1,
        CV_IMWRITE_PNG_COMPRESSION = 16,
        CV_IMWRITE_PNG_STRATEGY = 17,
        CV_IMWRITE_PNG_BILEVEL = 18,
        CV_IMWRITE_PNG_STRATEGY_DEFAULT = 0,
        CV_IMWRITE_PNG_STRATEGY_FILTERED = 1,
        CV_IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY = 2,
        CV_IMWRITE_PNG_STRATEGY_RLE = 3,
        CV_IMWRITE_PNG_STRATEGY_FIXED = 4,
        CV_IMWRITE_PXM_BINARY = 32,
    };

    /// <summary>
    /// ピクセルの型を示す定数.
    /// </summary>
    enum IPL_DEPTH
    {
        IPL_DEPTH_1U = 1,
        IPL_DEPTH_8U = 8,
        IPL_DEPTH_16U = 16,
        IPL_DEPTH_8S = -2147483648 + 8,
        IPL_DEPTH_16S = -2147483648 + 16,
        IPL_DEPTH_32S = -2147483648 + 32,
        IPL_DEPTH_32F = 32,
        IPL_DEPTH_64F = 64,
    };
}

[↑戻る]


CvSize 構造体:
C# Copy imageCopy
// $Revision: 1.2 $

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace SampleCode.Ipl
{
    partial class Converter
    {
        /// <summary>
        /// CvSize 構造体を構築します.
        /// </summary>
        /// <param name="width">幅</param>
        /// <param name="height">高さ</param>
        /// <returns>
        ///        構築した CvSize を返します.
        /// </returns>
        private static CvSize cvSize(int width, int height)
        {
            CvSize result = new CvSize();
            result.width = width;
            result.height = height;
            return result;
        }
    }

    /// <summary>
    /// OpenCV のサイズ情報構造体.
    /// </summary>
    [StructLayout(LayoutKind.Sequential, Pack = 8)]
    struct CvSize
    {
        public int width;
        public int height;
    }
}

[↑戻る]


IplImage 構造体:
C# Copy imageCopy
// $Revision: 1.2 $

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.ComponentModel;

namespace SampleCode.Ipl
{
    /// <summary>
    /// IplImage 構造体.
    /// </summary>
    [StructLayout(LayoutKind.Sequential, Pack = 8)]
    struct IplImage
    {
        [EditorBrowsable(EditorBrowsableState.Never)]
        public int nSize;

        [EditorBrowsable(EditorBrowsableState.Never)]
        public int ID;

        [EditorBrowsable(EditorBrowsableState.Always)]
        public int nChannels;

        [EditorBrowsable(EditorBrowsableState.Never)]
        public int alphaChannel;

        [EditorBrowsable(EditorBrowsableState.Always)]
        public int depth;

        [EditorBrowsable(EditorBrowsableState.Never)]
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        public byte[] colorModel;

        [EditorBrowsable(EditorBrowsableState.Never)]
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        public byte[] channelSeq;

        [EditorBrowsable(EditorBrowsableState.Always)]
        public int dataOrder;

        [EditorBrowsable(EditorBrowsableState.Always)]
        public int origin;

        [EditorBrowsable(EditorBrowsableState.Never)]
        public int align;

        [EditorBrowsable(EditorBrowsableState.Always)]
        public int width;

        [EditorBrowsable(EditorBrowsableState.Always)]
        public int height;

        [EditorBrowsable(EditorBrowsableState.Never)]
        public IntPtr roi;

        [EditorBrowsable(EditorBrowsableState.Never)]
        public IntPtr maskROI;

        [EditorBrowsable(EditorBrowsableState.Never)]
        public IntPtr imageId;

        [EditorBrowsable(EditorBrowsableState.Never)]
        public IntPtr titleInfo;

        [EditorBrowsable(EditorBrowsableState.Never)]
        public int imageSize;

        [EditorBrowsable(EditorBrowsableState.Always)]
        public IntPtr imageData;

        [EditorBrowsable(EditorBrowsableState.Always)]
        public int widthStep;

        [EditorBrowsable(EditorBrowsableState.Never)]
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        public int[] BorderMode;

        [EditorBrowsable(EditorBrowsableState.Never)]
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        public int[] BorderConst;

        [EditorBrowsable(EditorBrowsableState.Never)]
        public IntPtr imageDataOrigin;
    }
}

[↑戻る]



Visual Basic:

関数の宣言:
Visual Basic Copy imageCopy
' $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices

Namespace Ipl
    Partial Class Converter
        ''' <summary>
        ''' 画像オブジェクトの生成.
        ''' </summary>
        ''' <param name="size">幅と高さ</param>
        ''' <param name="depth">ピクセルの型 [IPL_DEPTH_8U,_16U,_16S,_32S,_32F,_64F]</param>
        ''' <param name="channels">チャネル数 [1~4]</param>
        ''' <returns>
        '''        ヒープに確保された IplImage 構造体のアドレスを返します.
        ''' </returns>
        <DllImport("opencv_core245.dll", CharSet := CharSet.Ansi, CallingConvention := CallingConvention.Cdecl)> _
        Private Shared Function cvCreateImage(size As CvSize, depth As Integer, channels As Integer) As IntPtr
        End Function

        ''' <summary>
        ''' 画像オブジェクトの解放.
        ''' </summary>
        ''' <param name="image">確保した IplImage 構造体へのポインタ</param>
        <DllImport("opencv_core245.dll", CharSet := CharSet.Ansi, CallingConvention := CallingConvention.Cdecl)> _
        Private Shared Sub cvReleaseImage(ByRef image As IntPtr)
        End Sub

        ''' <summary>
        ''' 画像ファイルの読み込み.
        ''' </summary>
        ''' <param name="filename">ファイル名称</param>
        ''' <param name="flags">読み込み方法を指示するフラグ</param>
        ''' <returns>
        '''        ヒープに確保された IplImage 構造体のアドレスを返します.
        ''' </returns>
        <DllImport("opencv_highgui245.dll", CharSet := CharSet.Ansi, CallingConvention := CallingConvention.Cdecl)> _
        Private Shared Function cvLoadImage(filename As String, flags As CV_LOAD_IMAGE) As IntPtr
        End Function

        ''' <summary>
        ''' 画像ファイルの保存.
        ''' </summary>
        ''' <param name="filename">ファイル名称</param>
        ''' <param name="image">IplImage 構造体のアドレス</param>
        ''' <param name="param">保存方法を指示するパラメータ</param>
        ''' <returns>
        ''' </returns>
        <DllImport("opencv_highgui245.dll", CharSet := CharSet.Ansi, CallingConvention := CallingConvention.Cdecl)> _
        Private Shared Function cvSaveImage(filename As String, image As IntPtr, param As Integer()) As Integer
        End Function
    End Class
End Namespace

[↑戻る]


定数の定義:
Visual Basic Copy imageCopy
' $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices

Namespace Ipl
    ''' <summary>
    ''' 画像ファイル読み込み方法を指示するフラグ.
    ''' </summary>
    <Flags> _
    Enum CV_LOAD_IMAGE
        CV_LOAD_IMAGE_GRAYSCALE = 0
        CV_LOAD_IMAGE_COLOR = 1
        CV_LOAD_IMAGE_ANYDEPTH = 2
        CV_LOAD_IMAGE_ANYCOLOR = 4
    End Enum

    ''' <summary>
    ''' 画像ファイル保存方法を指示するフラグ.
    ''' </summary>
    Enum CV_IMWRITE
        CV_IMWRITE_JPEG_QUALITY = 1
        CV_IMWRITE_PNG_COMPRESSION = 16
        CV_IMWRITE_PNG_STRATEGY = 17
        CV_IMWRITE_PNG_BILEVEL = 18
        CV_IMWRITE_PNG_STRATEGY_DEFAULT = 0
        CV_IMWRITE_PNG_STRATEGY_FILTERED = 1
        CV_IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY = 2
        CV_IMWRITE_PNG_STRATEGY_RLE = 3
        CV_IMWRITE_PNG_STRATEGY_FIXED = 4
        CV_IMWRITE_PXM_BINARY = 32
    End Enum

    ''' <summary>
    ''' ピクセルの型を示す定数.
    ''' </summary>
    Enum IPL_DEPTH
        IPL_DEPTH_1U = 1
        IPL_DEPTH_8U = 8
        IPL_DEPTH_16U = 16
        IPL_DEPTH_8S = -2147483648 + 8
        IPL_DEPTH_16S = -2147483648 + 16
        IPL_DEPTH_32S = -2147483648 + 32
        IPL_DEPTH_32F = 32
        IPL_DEPTH_64F = 64
    End Enum
End Namespace

[↑戻る]


CvSize 構造体:
Visual Basic Copy imageCopy
' $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices

Namespace Ipl
    Partial Class Converter
        ''' <summary>
        ''' CvSize 構造体を構築します.
        ''' </summary>
        ''' <param name="width">幅</param>
        ''' <param name="height">高さ</param>
        ''' <returns>
        '''        構築した CvSize を返します.
        ''' </returns>
        Private Shared Function cvSize(width As Integer, height As Integer) As CvSize
            Dim result As New CvSize()
            result.width = width
            result.height = height
            Return result
        End Function
    End Class

    ''' <summary>
    ''' OpenCV のサイズ情報構造体.
    ''' </summary>
    <StructLayout(LayoutKind.Sequential, Pack := 8)> _
    Structure CvSize
        Public width As Integer
        Public height As Integer
    End Structure
End Namespace

[↑戻る]


IplImage 構造体:
Visual Basic Copy imageCopy
' $Revision: 1.1 $

Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.ComponentModel

Namespace Ipl
    ''' <summary>
    ''' IplImage 構造体.
    ''' </summary>
    <StructLayout(LayoutKind.Sequential, Pack := 8)> _
    Structure IplImage
        <EditorBrowsable(EditorBrowsableState.Never)> _
        Public nSize As Integer

        <EditorBrowsable(EditorBrowsableState.Never)> _
        Public ID As Integer

        <EditorBrowsable(EditorBrowsableState.Always)> _
        Public nChannels As Integer

        <EditorBrowsable(EditorBrowsableState.Never)> _
        Public alphaChannel As Integer

        <EditorBrowsable(EditorBrowsableState.Always)> _
        Public depth As Integer

        <EditorBrowsable(EditorBrowsableState.Never)> _
        <MarshalAs(UnmanagedType.ByValArray, SizeConst := 4)> _
        Public colorModel As Byte()

        <EditorBrowsable(EditorBrowsableState.Never)> _
        <MarshalAs(UnmanagedType.ByValArray, SizeConst := 4)> _
        Public channelSeq As Byte()

        <EditorBrowsable(EditorBrowsableState.Always)> _
        Public dataOrder As Integer

        <EditorBrowsable(EditorBrowsableState.Always)> _
        Public origin As Integer

        <EditorBrowsable(EditorBrowsableState.Never)> _
        Public align As Integer

        <EditorBrowsable(EditorBrowsableState.Always)> _
        Public width As Integer

        <EditorBrowsable(EditorBrowsableState.Always)> _
        Public height As Integer

        <EditorBrowsable(EditorBrowsableState.Never)> _
        Public roi As IntPtr

        <EditorBrowsable(EditorBrowsableState.Never)> _
        Public maskROI As IntPtr

        <EditorBrowsable(EditorBrowsableState.Never)> _
        Public imageId As IntPtr

        <EditorBrowsable(EditorBrowsableState.Never)> _
        Public titleInfo As IntPtr

        <EditorBrowsable(EditorBrowsableState.Never)> _
        Public imageSize As Integer

        <EditorBrowsable(EditorBrowsableState.Always)> _
        Public imageData As IntPtr

        <EditorBrowsable(EditorBrowsableState.Always)> _
        Public widthStep As Integer

        <EditorBrowsable(EditorBrowsableState.Never)> _
        <MarshalAs(UnmanagedType.ByValArray, SizeConst := 4)> _
        Public BorderMode As Integer()

        <EditorBrowsable(EditorBrowsableState.Never)> _
        <MarshalAs(UnmanagedType.ByValArray, SizeConst := 4)> _
        Public BorderConst As Integer()

        <EditorBrowsable(EditorBrowsableState.Never)> _
        Public imageDataOrigin As IntPtr
    End Structure
End Namespace

[↑戻る]