Last active
December 25, 2016 08:28
-
-
Save 0V/d1d274f8674bf657003e to your computer and use it in GitHub Desktop.
OpenCvSharp で色領域抽出 (C++ API で)
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 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