Microsoft MVP성태의 닷넷 이야기
안녕하세요. 초보개발자입니다. [링크 복사], [링크+제목 복사],
조회: 15081
글쓴 사람
게스트
홈페이지
첨부 파일

안녕하세요. 왕초보 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]


비밀번호

댓글 작성자
 



2019-02-24 01시00분
관련해서 찾아 보면 방송조차도 실시간으로 크로마 키 처리하다가 사람의 옷에 색상이 같은 것이 있으면 투명처리되어 배경이 투영된다고 하니, 이런 간단한 소스 코드에서는 지워지는 게 당연할 것입니다. 딱히 저도 영상 처리를 심도 있게 전공한 것은 아니므로 더 이상 조언드릴 것이 없군요. 관련해서는 다른 분들께 질문을 하시는 것이 좋겠습니다.
정성태
2019-02-24 01시18분
[게스트] 네~ 알겠습니다. 감사합니다. ^^
[guest]
2019-02-24 01시35분
[dimohy] 특정한 색을 감지하는것은 조명의 위치나 촬영 위치에 따라 밝기가 달라지므로 쉽지만은 않습니다만 크로마키로 선택하는 색이 일반적으로 잘 사용하지 않고 왜곡이 적은 색을 선택하기 때문에 결과물이 좋아야 합니다. 사람의 눈으로 봤을 때 배경색과 넥타이색이 엄연히 차이가 나므로 코드로 크로마키 영역을 추출하는것은 첨부한 영상 기준으로 가능해 보이네요. 과거 볼링핀 인식 처리를 이미지로 한 결험이ㅜ있어서 조만간 뎃글로 공유해볼께요
[guest]

... 61  62  [63]  64  65  66  67  68  69  70  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
1053폭풍코딩4/19/201216651스마트클라이언트 ctrl-c 복사가 작동하지 않습니다. [1]
1052에슈리온4/17/201233085ClickOnce 배포시 클라이언트의 설치경로를 지정할 수 없나요? [1]
1051최정수4/10/201219942WCF 클라이언트 비정상 종료 관련 [1]
1050에슈리온4/6/201222133관리자 권한과 ClickOnce, 그리고 Bootstrapper문제 [6]
1049김성혁4/4/201216724스마트클라이언트 stand-alone 방식의 배포 문제.. [1]
1048C#조으다3/27/201220268어셈블리 로드 / 언로드와 관련해서.. [6]
1047김우형3/23/201217822WCF 서비스를 이용한 데이터 전송 중 Exception 문의 [1]
1044임동찬2/29/201217725웹에서 COM Exception.. [2]
1043박성준2/24/201216265Lazy<T> 의 지연객체 생성 전에 실 객체의 Attribute분석 [2]파일 다운로드1
1042이성환2/20/201216695BlockingMethod에 빠진 스레드를 즉시 죽이고 싶습니다...;ㅅ; [2]파일 다운로드1
1039김재영2/15/201216010어셈블리에 사용자마다 다른 값을 적용하여 자동 빌드 방법이 있을까요? [2]
1037윈드로니2/12/201217479WPF 관련 질문 드립니다. [2]
1035임동찬2/9/201215826XML, XSD, XMLCodeGenerator 관련 [2]
1033곽성현2/7/201216363훔..윈도우 디바이스 드라이버 관련 [1]
1030궁빈2/2/201218798msbuild를 이용한 웹게시 및 자동 Dist 방법론에 대해 질문 드립니다!! [6]
1028신정환1/30/201215996기존 legacy Windows application이 WoA 환경에서 동작되지 않는 이유가 무얼까요? [2]
1026노현철1/19/201217958WPF가 XP에서 느리게 로딩되는 현상에 대해 질문드립니다. [4]
1025궁그미1/18/201218921네이버 소켓 로그인 이해가 안되는점이 있는데요 [2]
1022선무당1/11/201216919TFS 에서 공통 Assembly 공유 방법에 대해서 해결책이 없을까요? [2]
1021김재영1/8/201216067대리자를 메소드 파라메터로 넘겨도 됩니까? [2]파일 다운로드1
1019남산골11/13/201918689안녕하세요!! 성태님~~ [3]
1018강한구12/29/201121979WPF ClickOnce 배포시 콤포넌트 dll 다운로드 문제에 대하여 질문 있습니다. [1]
1017임동찬12/28/201118906smart client와 xbop, silverlight [6]
1015개똥이12/22/201116327RMCLOCK 설정 관련 질문이요ㅜ [2]
1011사길수12/16/201116376hyper-v 이더넷 카드 관련 문의 좀 드립니다. [1]
1006루로니12/13/201118485윈도우7과 XP의 DLL후킹 처리에 관해서 질문입니다. [3]
... 61  62  [63]  64  65  66  67  68  69  70  71  72  73  74  75  ...