画像ヒストグラム作成
Namespace: fvalgcliAssembly: fvalgcli (in fvalgcli.dll) Version: 3.1.0.0 (3.1.0.11)
Syntax
C# |
---|
public static int fnFIE_make_histogram( FHANDLE hImg, int iChaNo, ref UINT_PTR unppHist, ref int ipHistLen ) |
Visual Basic |
---|
Public Shared Function fnFIE_make_histogram ( hImg As FHANDLE, iChaNo As Integer, ByRef unppHist As UINT_PTR, ByRef ipHistLen As Integer ) As Integer |
Parameters
- hImg
- Type: fvalgcli..::..FHANDLE
入力画像のハンドル (type: uc8, s16, us16)
- iChaNo
- Type: System..::..Int32
処理したいチャネルの番号
- unppHist
- Type: fvalgcli..::..UINT_PTR%
ヒストグラムのメモリ。(外部で確保したメモリのアドレス、または IntPtr.Zero を指定します。)
- ipHistLen
- Type: System..::..Int32%
メモリ確保した場合はそのメモリの量を入力(UINT数単位)。 メモリ確保しなかった場合は関数内部確保のメモリの量を出力(UINT数単位)。
Return Value
Type: Int32以下のエラーコードを返します。
エラーコード:
f_err | 内容 |
---|---|
F_ERR_NONE | 正常終了 |
F_ERR_NOMEMORY | メモリ不足で確保に失敗した |
F_ERR_INVALID_IMAGE | 不正な画像が渡された |
F_ERR_INVALID_PARAM | パラメータ不正 |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
Remarks
Examples
C# | Copy |
---|---|
// $Revision: 1.1 $ using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using fvalgcli; namespace TC { public partial class FIE { /// <summary> /// ヒストグラム計測 (メモリ外部確保版) /// </summary> [FvPluginExecute] public void fnFIE_make_histogram() { int status = (int)f_err.F_ERR_NONE; FHANDLE hImg = FHANDLE.Zero; // 入力画像. const int iChaNo = 0; // 処理したいチャネルの番号. int ipHistLen = 256; // メモリの量. UINT_PTR unppHist = UINT_PTR.alloc(ipHistLen); // ヒストグラムのメモリ. try { // 入力画像を読み込む. api.fnFIE_load_bmp(TestImageDir + "/testdata/lena256.bmp", ref hImg, f_color_img_type.F_COLOR_IMG_TYPE_UC8); // 画像ヒストグラム作成. status = api.fnFIE_make_histogram(hImg, iChaNo, ref unppHist, ref ipHistLen); Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "fnFIE_make_histogram: エラーが発生しました。({0})", (f_err)status); Console.WriteLine("fnFIE_make_histogram"); } finally { hImg.Dispose(); unppHist.Dispose(); } } /// <summary> /// ヒストグラム計測 (メモリ内部確保版) /// </summary> [FvPluginExecute] public void fnFIE_make_histogram2() { int status = (int)f_err.F_ERR_NONE; FHANDLE hImg = FHANDLE.Zero; // 入力画像. const int iChaNo = 0; // 処理したいチャネルの番号. int ipHistLen = 0; // メモリの量. UINT_PTR unppHist = UINT_PTR.Zero; // ヒストグラムのメモリ. try { // 入力画像を読み込む. api.fnFIE_load_bmp(TestImageDir + "/testdata/lena256.bmp", ref hImg, f_color_img_type.F_COLOR_IMG_TYPE_UC8); // 画像ヒストグラム作成. status = api.fnFIE_make_histogram(hImg, iChaNo, ref unppHist, ref ipHistLen); Assert.IsTrue(status == (int)f_err.F_ERR_NONE, "エラーが発生しました。({0})", (f_err)status); // 結果を出力する. ConsoleOut.WriteFunctionName(":"); Console.Write("\tipHistLen = {0} ...", ipHistLen); ConsoleOut.IsTrue(ipHistLen == 256); } finally { hImg.Dispose(); unppHist.Dispose(); } } } /// <summary> /// ヒストグラムアクセス用クラス. /// </summary> internal class hist_access { /// <summary> /// 任意サイズの画像 Img に、ヒストグラム pHist を書き込む. /// </summary> /// <param name="Img"></param> /// <param name="pHist"></param> /// <param name="HistLen"></param> public static void to_img(FHANDLE Img, UINT_PTR pHist, int HistLen) { FHANDLE tmpImg = FHANDLE.Zero; FMATRIX_PTR mat = FMATRIX_PTR.Zero; DOUBLE_PTR pline_val = DOUBLE_PTR.Zero; try { uint max_val = 0; for (int i = 0; i < HistLen; i++) { uint val = pHist[i]; if (max_val < val) max_val = val; } int tmp_width = HistLen; int tmp_height = (int)max_val + 1; tmpImg = api.fnFIE_img_root_alloc((int)f_imgtype.F_IMG_UC8, 1, tmp_width, tmp_height); api.fnFIE_img_clear(tmpImg, 255); for (int i = 0; i < HistLen; i++) { double[] line_val = { 0 }; pline_val = Marshal.UnsafeAddrOfPinnedArrayElement(line_val, 0); DPNT_T start, end; start.x = end.x = i; start.y = max_val; end.y = max_val - pHist[i]; api.fnFIE_draw_line_seg(tmpImg, pline_val, start, end); } int width = api.fnFIE_img_get_width(Img); int height = api.fnFIE_img_get_height(Img); mat = api.fnFIE_mat_aalloc(3, 3); api.fnFIE_geotrans_calc_scale_matrix(mat, (double)width / tmp_width, (double)height / tmp_height); api.fnFIE_geotrans_affine(tmpImg, Img, FHANDLE.Zero, mat, false, f_sampling_mode.F_SAMPLING_BILINEAR); } finally { tmpImg.Dispose(); mat.Dispose(); pline_val.Dispose(); } } } } |
Visual Basic | Copy |
---|---|
' $Revision: 1.1 $ Imports System.Collections.Generic Imports System.Text Imports System.Runtime.InteropServices Imports fvalgcli Public Partial Class FIE ''' <summary> ''' ヒストグラム計測 (メモリ外部確保版) ''' </summary> <FvPluginExecute> _ Public Sub fnFIE_make_histogram() Dim status As Integer = CInt(f_err.F_ERR_NONE) Dim hImg As FHANDLE = FHANDLE.Zero ' 入力画像. Const iChaNo As Integer = 0 ' 処理したいチャネルの番号. Dim ipHistLen As Integer = 256 ' メモリの量. Dim unppHist As UINT_PTR = UINT_PTR.alloc(ipHistLen) ' ヒストグラムのメモリ. Try ' 入力画像を読み込む. api.fnFIE_load_bmp(TestImageDir & "/testdata/lena256.bmp", hImg, f_color_img_type.F_COLOR_IMG_TYPE_UC8) ' 画像ヒストグラム作成. status = api.fnFIE_make_histogram(hImg, iChaNo, unppHist, ipHistLen) Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "fnFIE_make_histogram: エラーが発生しました。({0})", CType(status, f_err)) Console.WriteLine("fnFIE_make_histogram") Finally hImg.Dispose() unppHist.Dispose() End Try End Sub ''' <summary> ''' ヒストグラム計測 (メモリ内部確保版) ''' </summary> <FvPluginExecute> _ Public Sub fnFIE_make_histogram2() Dim status As Integer = CInt(f_err.F_ERR_NONE) Dim hImg As FHANDLE = FHANDLE.Zero ' 入力画像. Const iChaNo As Integer = 0 ' 処理したいチャネルの番号. Dim ipHistLen As Integer = 0 ' メモリの量. Dim unppHist As UINT_PTR = UINT_PTR.Zero ' ヒストグラムのメモリ. Try ' 入力画像を読み込む. api.fnFIE_load_bmp(TestImageDir & "/testdata/lena256.bmp", hImg, f_color_img_type.F_COLOR_IMG_TYPE_UC8) ' 画像ヒストグラム作成. status = api.fnFIE_make_histogram(hImg, iChaNo, unppHist, ipHistLen) Assert.IsTrue(status = CInt(f_err.F_ERR_NONE), "エラーが発生しました。({0})", CType(status, f_err)) ' 結果を出力する. ConsoleOut.WriteFunctionName(":") Console.Write(vbTab & "ipHistLen = {0} ...", ipHistLen) ConsoleOut.IsTrue(ipHistLen = 256) Finally hImg.Dispose() unppHist.Dispose() End Try End Sub End Class ''' <summary> ''' ヒストグラムアクセス用クラス. ''' </summary> Friend Class hist_access ''' <summary> ''' 任意サイズの画像 Img に、ヒストグラム pHist を書き込む. ''' </summary> ''' <param name="Img"></param> ''' <param name="pHist"></param> ''' <param name="HistLen"></param> Public Shared Sub to_img(Img As FHANDLE, pHist As UINT_PTR, HistLen As Integer) Dim tmpImg As FHANDLE = FHANDLE.Zero Dim mat As FMATRIX_PTR = FMATRIX_PTR.Zero Dim pline_val As DOUBLE_PTR = DOUBLE_PTR.Zero Try Dim max_val As UInteger = 0 For i As Integer = 0 To HistLen - 1 Dim val As UInteger = pHist(i) If max_val < val Then max_val = val End If Next Dim tmp_width As Integer = HistLen Dim tmp_height As Integer = CInt(max_val) + 1 tmpImg = api.fnFIE_img_root_alloc(CInt(f_imgtype.F_IMG_UC8), 1, tmp_width, tmp_height) api.fnFIE_img_clear(tmpImg, 255) For i As Integer = 0 To HistLen - 1 Dim line_val As Double() = {0} pline_val = Marshal.UnsafeAddrOfPinnedArrayElement(line_val, 0) Dim start As DPNT_T, [end] As DPNT_T start.x = InlineAssignHelper([end].x, i) start.y = max_val [end].y = max_val - pHist(i) api.fnFIE_draw_line_seg(tmpImg, pline_val, start, [end]) Next Dim width As Integer = api.fnFIE_img_get_width(Img) Dim height As Integer = api.fnFIE_img_get_height(Img) mat = api.fnFIE_mat_aalloc(3, 3) api.fnFIE_geotrans_calc_scale_matrix(mat, CDbl(width) / tmp_width, CDbl(height) / tmp_height) api.fnFIE_geotrans_affine(tmpImg, Img, FHANDLE.Zero, mat, False, f_sampling_mode.F_SAMPLING_BILINEAR) Finally tmpImg.Dispose() mat.Dispose() pline_val.Dispose() End Try End Sub Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, value As T) As T target = value Return value End Function End Class |