ushort arrayA の各値を、同じ長さの ushort arrayB の対応するインデックス値からすばやく減算する必要があります。
さらに、差が負の場合は、負の差ではなくゼロを格納する必要があります。
(同じサイズの別の画像から 640x512 の画像を差し引いているため、正確には長さ = 327680 です)。
以下のコードは現在 20 ミリ秒ほどかかっていますが、できれば 5 ミリ秒以下に抑えたいと考えています。安全でないコードは問題ありませんが、私は安全でないコードを書くのが得意ではないので、例を挙げてください。
ありがとうございました!
public ushort[] Buffer { get; set; }
public void SubtractBackgroundFromBuffer(ushort[] backgroundBuffer)
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
int bufferLength = Buffer.Length;
for (int index = 0; index < bufferLength; index++)
{
int difference = Buffer[index] - backgroundBuffer[index];
if (difference >= 0)
Buffer[index] = (ushort)difference;
else
Buffer[index] = 0;
}
Debug.WriteLine("SubtractBackgroundFromBuffer(ms): " + sw.Elapsed.TotalMilliseconds.ToString("N2"));
}
更新:厳密には C# ではありませんが、これを読んでいる他の人の利益のために、最終的に次のコードを使用してソリューションに C++ CLR クラス ライブラリを追加することになりました。約 3.1ms で実行されます。アンマネージ C++ ライブラリが使用されている場合、約 2.2 ミリ秒で実行されます。時差が小さかったので、管理されたライブラリを使用することにしました。
// SpeedCode.h
#pragma once
using namespace System;
namespace SpeedCode
{
public ref class SpeedClass
{
public:
static void SpeedSubtractBackgroundFromBuffer(array<UInt16> ^ buffer, array<UInt16> ^ backgroundBuffer, int bufferLength);
};
}
// SpeedCode.cpp
// This is the main DLL file.
#include "stdafx.h"
#include "SpeedCode.h"
namespace SpeedCode
{
void SpeedClass::SpeedSubtractBackgroundFromBuffer(array<UInt16> ^ buffer, array<UInt16> ^ backgroundBuffer, int bufferLength)
{
for (int index = 0; index < bufferLength; index++)
{
buffer[index] = (UInt16)((buffer[index] - backgroundBuffer[index]) * (buffer[index] > backgroundBuffer[index]));
}
}
}
次に、次のように呼び出します。
public void SubtractBackgroundFromBuffer(ushort[] backgroundBuffer)
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
SpeedCode.SpeedClass.SpeedSubtractBackgroundFromBuffer(Buffer, backgroundBuffer, Buffer.Length);
Debug.WriteLine("SubtractBackgroundFromBuffer(ms): " + sw.Elapsed.TotalMilliseconds.ToString("N2"));
}