Skip to content

Instantly share code, notes, and snippets.

@0V
Last active August 29, 2015 14:17
Show Gist options
  • Save 0V/bacd17ffe49da5bf8fe9 to your computer and use it in GitHub Desktop.
Save 0V/bacd17ffe49da5bf8fe9 to your computer and use it in GitHub Desktop.
OpenCvSharp で色領域抽出 (めっちゃ C ライク)
using OpenCvSharp;
using System;
namespace OpenCvSharpSample
{
class Program
{
static void Main(string[] args)
{
// ファイル読み込み
var srcImage = new IplImage("lena.jpg");
var dstImage = new IplImage(srcImage.Size,srcImage.Depth,srcImage.NChannels);
// 肌色領域を抽出
ColorExtraction(srcImage,dstImage, ColorConversion.BgrToHsv, 0, 10, 80, 255, 0, 255);
Cv.ShowImage("SrcMat", srcImage);
Cv.ShowImage("SkinColor", dstImage);
Cv.WaitKey(0);
}
public static void ColorExtraction(IplImage srcImage, IplImage dstImage, ColorConversion code,
int ch1Lower, int ch1Upper,
int ch2Lower, int ch2Upper,
int ch3Lower, int ch3Upper)
{
if (srcImage == null)
throw new ArgumentNullException("srcImage");
else if (dstImage == null)
throw new ArgumentNullException("dstImage");
IplImage colorImage;
IplImage ch1Image, ch2Image, ch3Image;
IplImage maskImage;
int i, k;
int[] lower = new int[3];
int[] upper = new int[3];
int[] val = new int[3];
CvMat lut;
colorImage = Cv.CreateImage(Cv.GetSize(srcImage), srcImage.Depth, srcImage.NChannels);
Cv.CvtColor(srcImage, colorImage, code);
lut = Cv.CreateMat(256, 1, MatrixType.U8C3);
lower[0] = ch1Lower;
lower[1] = ch2Lower;
lower[2] = ch3Lower;
upper[0] = ch1Upper;
upper[1] = ch2Upper;
upper[2] = ch3Upper;
for (i = 0; i < 256; i++)
{
for (k = 0; k < 3; k++)
{
if (lower[k] <= upper[k])
{
if ((lower[k] <= i) && (i <= upper[k]))
{
val[k] = 255;
}
else
{
val[k] = 0;
}
}
else
{
if ((i <= upper[k]) || (lower[k] <= i))
{
val[k] = 255;
}
else
{
val[k] = 0;
}
}
}
Cv.Set1D(lut, i, new CvScalar(val[0], val[1], val[2]));
}
Cv.LUT(colorImage, colorImage, lut);
Cv.ReleaseMat(lut);
ch1Image = Cv.CreateImage(Cv.GetSize(colorImage), colorImage.Depth, 1);
ch2Image = Cv.CreateImage(Cv.GetSize(colorImage), colorImage.Depth, 1);
ch3Image = Cv.CreateImage(Cv.GetSize(colorImage), colorImage.Depth, 1);
Cv.Split(colorImage, ch1Image, ch2Image, ch3Image, null);
maskImage = Cv.CreateImage(Cv.GetSize(colorImage), colorImage.Depth, 1);
Cv.And(ch1Image, ch2Image, maskImage);
Cv.And(maskImage, ch3Image, maskImage);
Cv.Zero(dstImage);
Cv.Copy(srcImage, dstImage, maskImage);
Cv.ReleaseImage(colorImage);
Cv.ReleaseImage(ch1Image);
Cv.ReleaseImage(ch2Image);
Cv.ReleaseImage(ch3Image);
Cv.ReleaseImage(maskImage);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment