안녕하세요. 왕초보 c# 나홀로 개발자입니다.
현재 윈폼으로 블루스크린의 크로마키 기능(사진에서 파란색 배경을 제거하고 다른 이미지의 배경을 넣는 것 / 영상이 아닌 사진의 크로마키입니다.)을 개발하려고 하는데
어디에도 도움을 요청할때도 없고 중간에 막혀서(파란색을 제거하는 부분) 여쭤보고자 이렇게 적어봅니다.
[질문사항]
1. 사진의 크로마키 기능을 개발하려고 하면 어떤 방법으로 개발해야 하나요? 검색을 해보니 openCV, kinect sdk 로 크로마키를 하라는 얘기가 나오는데 이런것으로 크로마키를 하는것이 맞나요?
2. 구글 검색해서 아래 소스를 사용하여 이용하니 파란색은 제거가 되는데 파란색 계열의 모든 부분이 제거가 됩니다. 소스코드 내 조건문의 수치를 조절해서 했는데도 사진 속 사람이 파란색 계열의 넥타이를 했는데 이것도 모두 지워지네요.(사진첨부) 사진의 지우고 싶은 배경의 픽셀 하나를 가져와서 그것을 기반으로 범위를 산정해서 지우고 싶은데 어떤식으로 무엇을 참고해야 할까요?
3. 도움이 될만한 사이트나 조언을 해주시면 정말정말 감사하겠습니다.
감사합니다.
public void RemoveBackground()
{
path = Directory.GetParent(Environment.CurrentDirectory).Parent.FullName;
pathImage = Path.Combine(path, "ui\\green\\green.jpg");
pathImageOutput = Path.Combine(path, "ui\\green\\green2.jpg");
Bitmap original = new Bitmap(pathImage);
Bitmap clone = new Bitmap(original.Width, original.Height, PixelFormat.Format32bppArgb);
{
using (original)
using (Graphics gr = Graphics.FromImage(clone))
{
gr.DrawImage(original, new Rectangle(0, 0, clone.Width, clone.Height));
}
var data = clone.LockBits(new Rectangle(0, 0, clone.Width, clone.Height), ImageLockMode.ReadWrite, clone.PixelFormat);
var bytes = Math.Abs(data.Stride) * clone.Height;
byte[] rgba = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(data.Scan0, rgba, 0, bytes);
var pixels = Enumerable.Range(0, rgba.Length / 4).Select(x => new
{
B = rgba[x * 4],
G = rgba[(x * 4) + 1],
R = rgba[(x * 4) + 2],
A = rgba[(x * 4) + 3],
MakeTransparent = new Action(() => rgba[(x * 4) + 3] = 0)
});
pixels
.AsParallel()
.ForAll(p =>
{
byte max = Math.Max(Math.Max(p.R, p.G), p.B);
byte min = Math.Min(Math.Min(p.R, p.G), p.B);
if (p.B != min && (p.B == max || max - p.B < 90) && (max - min) > 100)
{
p.MakeTransparent();
}
});
System.Runtime.InteropServices.Marshal.Copy(rgba, 0, data.Scan0, bytes);
clone.UnlockBits(data);
clone.Save(pathImageOutput, ImageFormat.Png);
clone.Dispose();
original.Dispose();
}
}
[최초 등록일: ]
[최종 수정일: 2/23/2019]