IronPythonからOpenCVSharp その2(旧)

19th August 2022 at 2:55pm

OpenCvSharp4.1のころの記事です。

IronPythonからOpenCVSharp その1 で、IronPythonからOpenCVを使う事ができるようになりました。

しかし、個人的に欲しいなあ、という機能がいくつかあったのでC++/CLIで作成しました。以下にヘッダーファイルをあげます。

// wk_util_opencvsharp.h

#pragma once

using namespace System;
using namespace OpenCvSharp;
using namespace System::Drawing;
using namespace System::Drawing::Imaging;
using namespace System::Windows::Threading;

namespace wk_util_opencvsharp
{
	public ref class Cv2Util
	{
	public:
		static void Memcopy(IntPtr src, IntPtr dst, int num);
		static Byte GetByteValue(Mat^ mat, int index);
		static void SetByteValue(Mat^ mat, int index, Byte value);
		static void GrayscalePalette(Bitmap^ bmp);
		static int SizeOfSbyte();
		static int SizeOfByte();
		static int SizeOfShort();
		static int SizeOfUshort();
		static int SizeOfInt();
		static int SizeOfUint();
		static int SizeOfLong();
		static int SizeOfUlong();
		static int SizeOfChar();
		static int SizeOfFloat();
		static int SizeOfDouble();
		static int SizeOfDecimal();
		static int SizeOfBool();
		static void DoEvents();
	};

	public ref class LockBitmap
	{
	private:
		System::Drawing::Bitmap^ _src;
		System::Drawing::Imaging::BitmapData^ _srcData;
		System::Drawing::Imaging::PixelFormat _pf;
		int _w;
		int _h;
		int _st;
		IntPtr _ip;

	public:
		LockBitmap(System::Drawing::Bitmap^ ini);

		void Free();

		property IntPtr Ptr
		{
			IntPtr get()
			{
				return _ip;
			}
		}
	};
}

簡単に関数やクラスを説明します。

  • 「void Memcopy(IntPtr src, IntPtr dst, int num)」
    • C#の「Marshal.Copy()」は、「IntPtr」同士のコピーできません。C++の「memcpy」を利用しました。まさにC++/CLIのマネージ拡張機能の活用です。

  • 「Byte GetByteValue(Mat^ mat, int index)」と「void SetByteValue(Mat^ mat, int index, Byte value)」
    • IronPythonから、「Mat.At」、「Mat.Get」、「Mat.GetArray()」などで、画像データであるMatの要素にうまくアクセスすることができませんでした。(Set系もです。)勉強不足です。。。
    • 代りに「Mat.DataPointer」を利用した簡単な関数を作成しました。

  • 「void GrayscalePalette(Bitmap^ bmp)」
    • Bitmapクラスを「PixelFormat.Format8bppIndexed」で新規作成した時、カラーパレットはグレイスケールになっていません。
    • カラーパレットをグレイスケールにする関数です。

  • 「int SizeOf***()」
    • C++の「sizeof」関数です。

  • 「LockBitmapクラス」
    • Bitmapクラスから先頭ポインタを取得するためのクラスです。使い方は以下の通りです。

詳細は「wk_util_opencvsharp.cpp」を見てください。そんなに難しいことはしていません。


HomeへIronPythonの記事Topへ