현실감각 0% :: 현실감각 0%

컴퓨터 관련 2011. 9. 7. 10:05

Data Matrix 바코드 인식



회사에서 생산하는 PCB를 Data Matrix 형식의 2D 바코드로 관리하고 있는데... 바코드 프린터를 바꿨더니 바코드스캐너가 인식을 못한다. 그래서 3시간 코딩.. 아니 3시간 웹서핑해서 구한 코드를 조합해서 카메라로 바코드 인식하는 프로그램 완성!!




영상처리나 비전 코딩할때는 openCV를 주로 사용해서 C++이 익숙한데, 회사에서 개발할 때는 대부분 C#을 쓰기 때문에 어떻게 할까 고민하며 인터넷 서핑하다가 린토리(http://entist.tistory.com) 님께서 블로그에 올려주신 openCVSharp 프로젝트 파일을 베이스로 사용하였음.
저분 블로그에 openCV를 C#에서 사용하게끔 해주는 openCVSharp 설명과 예제가 잘 나와있어서 openCVSharp 문외한인 내가 헤딩하며 5~7시간 작업할 것을 30분만에 해결!!!

Data Matrix 디코딩 하려고 관련 논문 검색. 막상 몇장 구해놓고 보니 영어의 압박에 눈이 감겨서 그냥 오픈소스가 있나 구글신께 부탁해봄.
하지만 구글신께서 요즘 모토로라 인수하는 바람에 바쁘셨는지, 유료 SDK와 무슨 이상한 토렌트 다운로드 사이트만 알려주심. 그래서 재야 개발자들의 모임 sourceforge에서 다시 검색했더니 c#으로 사용할 수 있는 디코더 발견!!(인코딩도 됨!!)

바로 여기! DataMatrix.Net
http://sourceforge.net/projects/datamatrixnet/

사용법 뭐 그런거 없다.
DataMatrix.net.dll 참조하고 제공하는 함수 가져다 쓰면 됨;
아래는 기본 제공하는 예제소스에 인코딩, 디코딩 섞여있어 디코딩만 쏙 빼낸 소스~

        static void Main(string[] args)
        {
            TestMatrixEnDecoder();
        }

        private static void TestMatrixEnDecoder()
        {
            DmtxImageDecoder decoder = new DmtxImageDecoder();
            List<string> codes = decoder.DecodeImage((Bitmap)Bitmap.FromFile(@"c:\test.png"), 1, new TimeSpan(0, 0, 3));
            foreach (string code in codes)
            {
                Console.WriteLine("Decoded:\n" + code);
            }
        }



TestMatrixEnDecoder();
이 함수 말고도 두개인가(아니면 더 많을지도) 더 제공하는데 써보지는 않았다.
그냥 젤 위에 있어서 선택함.
결과는 초점도 잘 안맞는 2만원짜리 웹캠으로 찍은 결과물도 그럭저럭 데이터가 잘 나왔다.
물론 오인식 하는 경우도 몇번 발생했지만, 뭐 팔아먹을것도 아니고 혼자 쓸건데 이정도면 감지덕지^-^