emgu CV を使用して画像からの静脈検出に取り組んでいますが、いくつか質問があります。色または色の範囲を検出する簡単な方法はありますか? この色を別の色 (画像の平均色など) に置き換える簡単な方法はありますか? パフォーマンスを低下させずにそれを達成するにはどうすればよいですか?
前もって感謝します!
この問題が約 3 年間公開されたとは想像できません...
public static Image<Bgr, byte> BackgroundToGreen(Image<Bgr, byte> rgbimage)
{
Image<Bgr, byte> ret = rgbimage;
var image = rgbimage.InRange(new Bgr(190, 190, 190), new Bgr(255, 255, 255));
var mat = rgbimage.Mat;
mat.SetTo(new MCvScalar(200, 237, 204), image);
mat.CopyTo(ret);
return ret;
}
なぜマトリックス?
http://www.emgu.com/wiki/index.php/Working_with_Images#Accessing_the_pixels_from_Mat
メモリが事前に割り当てられ固定されている Image<,> クラスとは異なり、Mat のメモリは Open CV 関数呼び出しによって自動的に再割り当てできます。マネージド メモリを事前に割り当てることはできず、Mat オブジェクトの有効期間を通じて同じメモリが使用されると仮定します。その結果、Mat クラスには、マネージ配列を介してピクセルにアクセスできる Image<,> クラスのような Data プロパティが含まれていません。
インレンジとは?
http://www.emgu.com/wiki/files/2.0.0.0/html/07eff70b-f81f-6313-98a9-02d508f7c7e0.htm
画像要素が 2 つのスカラーの間にあることを確認します
戻り値
res[i,j] = 範囲内の場合は 255、そうでない場合は 0
SetTo とは何ですか?
http://www.emgu.com/wiki/files/2.4.0/document/html/0309f41d-aa02-2c0d-767f-3d7d8ccc9212.htm
宛先 GpuMat の選択されたすべての要素にスカラー値をコピーします: GpuMat(I)=value if mask(I)!=0
そうです。
引用元: http://blog.zsxsoft.com/post/24 (中国語のみ) (CC BY-NC-ND)
Image<Bgr, Byte> img;
Image<Gray, Byte> grayImg = img.Convert<Gray, Byte>();
grayImg = img.InRange(new Bgr(minB, minG, minR), new Bgr(new Bgr(maxB, maxG, maxR);
色(範囲)をバイナリで表示するだけで、最速の方法です
ただし、特定の範囲の色を検出して置き換えたい場合は、次のようにします。
Image<Bgr, Byte> img;
for (int i = 0; i < img.ManagedArray.GetLength(0); i++)
{
for (int j = 0; j < img.ManagedArray.GetLength(1); j++)
{
Bgr currentColor = img[i, j];
if (currentColor.Blue >= minB && currentColor.Blue <= maxB && currentColor.Green >= minG && maxG <= trackBar13.Value && currentColor.Red >= minR && currentColor.Red <= maxR)
{
img[i, j] = new Bgr(B,G,R);
}
}
}