Skip to content

Instantly share code, notes, and snippets.

@0V
Last active December 25, 2016 08:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 0V/d1d274f8674bf657003e to your computer and use it in GitHub Desktop.
Save 0V/d1d274f8674bf657003e to your computer and use it in GitHub Desktop.
OpenCvSharp で色領域抽出 (C++ API で)
using OpenCvSharp;
using OpenCvSharp.CPlusPlus;
using System;
namespace OpenCvSharpSample
{
class Program
{
static void Main(string[] args)
{
// ファイル読み込み
var mat = new Mat("lena.jpg");
// 肌色領域を抽出
var skinMat = ColorExtraction(mat, ColorConversion.BgrToHsv, 0, 10, 80, 255, 0, 255);
Cv2.ImShow("SrcMat", mat);
Cv2.ImShow("SkinColor", skinMat);
Cv2.WaitKey(0);
}
// OpenCvSharp3 では ColorConversionCodes
public static Mat ColorExtraction(Mat srcMat, ColorConversion code,
int ch1Lower, int ch1Upper,
int ch2Lower, int ch2Upper,
int ch3Lower, int ch3Upper)
{
if (srcMat == null)
throw new ArgumentNullException("srcMat");
var colorMat = srcMat.CvtColor(code);
var lut = new Mat(256, 1, MatType.CV_8UC3);
var lower = new int[3] { ch1Lower, ch2Lower, ch3Lower };
var upper = new int[3] { ch1Upper, ch2Upper, ch3Upper };
// cv::Mat_<cv::Vec3b>
var mat3 = new MatOfByte3(lut);
var indexer = mat3.GetIndexer();
for (int i = 0; i < 256; i++)
{
var color = indexer[i];
byte temp;
for (int k = 0; k < 3; k++)
{
if (lower[k] <= upper[k])
{
if ((lower[k] <= i) && (i <= upper[k]))
{
temp = 255;
}
else
{
temp = 0;
}
}
else
{
if ((i <= upper[k]) || (lower[k] <= i))
{
temp = 255;
}
else
{
temp = 0;
}
}
color[k] = temp;
}
indexer[i] = color;
}
Cv2.LUT(colorMat, lut, colorMat);
var channelMat = colorMat.Split();
var maskMat = new Mat();
Cv2.BitwiseAnd(channelMat[0], channelMat[1], maskMat);
Cv2.BitwiseAnd(maskMat, channelMat[2], maskMat);
srcMat.CopyTo(maskMat, maskMat);
return maskMat;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment