Last active
August 29, 2015 14:17
-
-
Save 0V/bacd17ffe49da5bf8fe9 to your computer and use it in GitHub Desktop.
OpenCvSharp で色領域抽出 (めっちゃ C ライク)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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