IplImage 相互変換
Classes
Class | Description | |
---|---|---|
IplImageConverter | IplImage 相互変換クラス |
Structures
Structure | Description | |
---|---|---|
IplImageSize | 画像サイズ情報構造体 |
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 |
---|---|
// $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 |
---|---|
// $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 |
---|---|
// $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 |
---|---|
// $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 |
---|---|
' $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 |
---|---|
' $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 |
---|---|
' $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 |
---|---|
' $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 |