본문 바로가기
// Field Software Engineer · Machine Vision

Field Log: C# & Machine Vision

FA 현장에서 비전 검사 장비를 다루는 SW 필드 엔지니어입니다. 셋업, 트러블슈팅, 현장 대응 중에 막혔던 부분을 기초부터 다시 짚어 보며, C#과 머신비전 이야기를 콘솔 예제 하나씩 손으로 쳐서 기록합니다. 저도 잘 몰라요. AI와 함께 합니다.

지금 연재 중 C# 주니어 Day01~Day28 작은 코드부터 한 조각씩. 카메라·영상 처리·UI·PLC 통신을 엮어 검사 프로그램 만들기.

시리즈

최근 글

반응형

전체 글

글 132개
  1. C# [C#] Serilog 로그란? 사용법부터 성능과 오류 분석까지

    C#으로 프로그램을 개발하거나 유지보수하다 보면 다음과 같은 코드를 볼 수 있다.C#Log.Information("프로그램 시작");Log.Warning("카메라 응답 지연");Log.Error("카메라 연결 실패");이 코드는 프로그램에서 발생한 일을 기록하는 로그(Logging) 기능이다.그런데 로그를 남기기 위해 반드시 Serilog라는 라이브러리를 설치해야 할까?C#에서 제공하는 Console.WriteLine()이나 Debug.WriteLine()을 사용하면 안 되는 것일까?또한 로그를 기록하면 프로그램이 느려지지는 않을까?Serilog는 C#과 .NET 프로그램에서 로그를 체계적으로 기록하고 관리하도록 도와주는 외부 라이브러리다.Serilog를 반드시 사용해야 하는 것은 아니다. 하지만 프로그..

    2026.11.05
  2. C# [C#] Func란? delegate와 차이부터 실무 활용까지

    C# 프로그램을 개발하다 보면 다음과 같은 코드를 볼 수 있다.C#Func calculate = (a, b) => a + b;처음 보면 Func가 무엇인지, 왜 int가 세 번 나오는지 이해하기 어렵다.또한 Func를 배우다 보면 델리게이트(Delegate)와 람다식(Lambda Expression)이라는 용어도 등장한다.이 세 가지는 서로 관련이 있지만 같은 개념은 아니다.먼저 핵심부터 알아보자.Func는 C# 키워드가 아니라 .NET에서 미리 제공하는 제네릭 델리게이트 형식이다.쉽게 말하면 메서드를 변수처럼 보관하거나 다른 메서드에 전달할 수 있도록 도와주는 도구다.이번 글에서는 Func가 왜 필요한지, 직접 선언하는 델리게이트와 무엇이 다른지, 실제로 어떤 상황에서 사용하는지 알아본다.예제는 Vis..

    2026.11.05
  3. C# [C#] NuGet 패키지란? 개념부터 설치와 활용까지

    C#으로 프로그램을 개발하다 보면 다음과 같은 이름을 자주 볼 수 있다.NuGetNuGet PackageNuGet Package ManagerNewtonsoft.JsonSerilogOpenCvSharpVisual Studio 2022에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하면 NuGet 패키지 관리라는 메뉴도 볼 수 있다.그런데 NuGet은 정확히 무엇일까?왜 다른 개발자가 만든 라이브러리를 설치할 때 사용하는 것일까?또한 DLL 파일을 직접 추가하는 것과 NuGet 패키지를 설치하는 것은 무엇이 다를까?NuGet은 .NET 프로그램에서 필요한 라이브러리와 개발 도구를 쉽게 설치하고 관리하도록 도와주는 패키지 관리 시스템이다.이번 글에서는 NuGet의 개념부터 DLL과의 차이, Visual Studi..

    2026.11.05
  4. C#/C# 주니어 [C# 주니어 Day03] Template Method와 장치 상태

    1. 오늘 목표완료 기준Template Method를 "순서는 부모가, 내용은 자식이"라고 설명하고 OmniSight에서 3곳 이상 찾을 수 있다.DeviceBase의 Initialize/Start/Stop/Dispose가 상태를 어떻게 바꾸는지 상태 그림으로 그렸다.MiniSight DeviceBase를 작성하고, 일부러 OnStart에서 예외를 던져 Faulted가 되는 것을 디버거로 봤다.최소분량: 2, 3, 4, 6확장분량: Kata 확장 과제, 조건부 중단점/Tracepoint2. 🧒 초1 비유라면 끓이기 순서표를 엄마(부모 클래스)가 정했다.물 끓이기 → 2. 면 넣기 → 3. 스프 넣기 → 4. 불 끄기신라면이든 짜파게티든(자식 클래스) 1번과 4번은 똑같다. 2, 3번만 자기 방식으로 한..

    2026.11.05
  5. C# [C#] readonly 키워드 쉽게 이해하기 - const와 차이점

    C# 프로그램을 개발하다 보면 다음과 같은 코드를 자주 볼 수 있다.C#private readonly string _ipAddress;private readonly object _syncObj = new object();여기서 readonly는 무엇을 의미할까?readonly는 처음에 정한 값을 객체 생성 이후에 다시 대입하지 못하도록 제한하는 키워드다.쉽게 말하면 연필로 쓴 이름표와 네임펜으로 쓴 이름표의 차이와 비슷하다.이번 글에서는 readonly의 기본 개념부터 const와의 차이, 실제 WinForms 및 머신비전 프로그램에서 사용하는 방법까지 알아본다.기본 내용은 .NET Framework 4.7.2 / C# 7.3을 기준으로 설명한다. C# 8 이후에 추가된 문법은 뒤에서 별도로 다룬다.1...

    2026.11.05
  6. C# C# if문 중괄호 필수 사용 이유와 VS2022 설정

    C#에서 if문이나 for문을 작성할 때 실행할 문장이 한 줄이라면 중괄호 { }를 생략할 수 있습니다.C#if (isRunning) StartProcess();문법적으로 올바른 코드이며 정상적으로 실행됩니다. 하지만 유지보수 과정에서 실행할 문장이 추가되면 예상하지 못한 버그가 발생할 수 있습니다.C#if (isRunning){ StartProcess();}위와 같이 중괄호를 사용하는 이유는 단순히 코드 스타일을 통일하기 위해서만은 아닙니다. 조건문과 반복문의 실행 범위를 명확하게 표현하여 코드 수정 과정에서 발생할 수 있는 실수를 줄이기 위해서입니다.2014년 애플에서 발견된 goto fail 보안 취약점은 중괄호가 없는 조건문의 위험성을 보여주는 대표적인 사례입니다.이번 글에서는 애플의 ..

    2026.11.05
  7. C#/로또육사오 C# .NET 8 로또 번호 분석기 만들기: 콘솔과 백테스트

    이 글에서는 .NET 8 콘솔 프로그램으로 로또 당첨번호를 수집하고 분석하는 도구를 만든다. 받은 데이터를 JSON 파일로 저장하고, 최근 출현 횟수로 번호 조합을 만든다. 과거 회차에 같은 방법을 적용하는 백테스트도 구현한다.핵심은 데이터를 받아 저장하고 계산하는 프로그램의 흐름을 익히는 데 있다. HttpClient, JSON, async/await, 취소 처리를 차례로 연결한다. 로직을 LottoCore 라이브러리에 모으므로 나중에 WinForms 화면에서도 재사용할 수 있다. 동행복권 조회 부분에는 2026년 11월 4일 확인한 주소와 응답 구조를 반영했다.개발 환경과 전체 흐름예제의 개발 환경은 다음과 같다..NET 8, C# 12, Visual Studio 2022외부 패키지 없이 기본 기능만..

    2026.11.04
  8. C# C# Pre-Align 기초: 좌표부터 캘리브레이션까지

    종이에 네모 칸을 그리고 지우개를 올리면 매번 조금씩 다른 위치에 놓인다. 지우개가 옆으로 밀렸다면 옮겨야 한다. 비스듬하다면 돌려야 한다. 머신비전의 Pre-Align(사전 정렬)도 이와 비슷하다. 카메라로 제품의 위치와 방향을 측정한 뒤, 검사 전에 필요한 보정량을 계산한다.이 글에서는 두 개의 + 마크를 기준으로 위치와 각도를 구하는 과정을 다룬다. 좌표와 단위부터 시작해 삼각함수, 회전중심, 캘리브레이션, 행렬, 최소제곱법으로 이어 간다. 마지막에는 이 수학을 하나의 C# 콘솔 예제로 묶는다. 다 읽고 나면 두 마크의 픽셀 좌표에서 회전각과 이동량을 직접 계산하는 코드를 작성할 수 있다. WinForms 화면 제작은 2편에서 시작한다.수학 공식이 많이 나오지만 겁먹을 필요는 없다. 공식마다 손으로..

    2026.11.04
  9. C#/C# 주니어 [C# 주니어 Day02] 인터페이스와 계약, SOLID, 소유권

    1. 오늘 목표완료 기준"인터페이스에 의존한다"는 말을 OmniSight 예로 설명할 수 있다 (InspectionPipeline은 카메라 종류를 모른다).SOLID 5개 중 DIP, ISP, SRP를 OmniSight 코드로 하나씩 가리킬 수 있다.MiniSight Devices/Contracts.cs(IDevice, IImageSource, DeviceState, ImageFrame)를 손으로 작성했다.ImageFrame.Dispose()를 두 번 불러도 안전하다는 걸 디버거로 확인했다.최소분량: 2, 3, 4, 6확장분량: 5 Kata 전부, 7번 Watch 실험2. 🧒 초1 비유인터페이스 = 콘센트 모양 약속. 벽 콘센트(검사기)는 "구멍 두 개" 모양만 약속한다. 드라이기든 선풍기든(카메라든 ..

    2026.11.04
  10. C#/C# 기초 체력 [C# 기초 B14] 패턴 없는 가짜 카메라 (Timer + B01~B13 합치기)

    1. 오늘 목표지금까지 배운 키워드만으로 50줄짜리 가짜 카메라를 만든다. 디자인 패턴은 하나도 없다. 그리고 Day04가 "이 카메라를 정해진 자리에 넣은 것"이라는 걸 확인한다.2. 🧒 비유: 자동 사진기**알람 시계(Timer)**가 0.3초마다 울린다. 울릴 때마다 사진기가 찰칵하고 번호를 붙인다.찰칵할 때마다 **초인종(event)**을 눌러 "사진 나왔어요!" 하고 알린다.Main은 리모컨(CancellationToken) 불이 켜질 때까지 기다린다. 5번째 사진을 받으면 정지 버튼을 누른다.다 쓰면 알람 시계를 **반납(Dispose)**한다.3. 오늘 새 키워드 표키워드역할사용법기억할 점System.Threading.Timer정해진 간격마다 스레드 풀 일꾼이 메서드를 부른다new Time..

    2026.11.04
C# [C#] Serilog 로그란? 사용법부터 성능과 오류 분석까지

C#으로 프로그램을 개발하거나 유지보수하다 보면 다음과 같은 코드를 볼 수 있다.C#Log.Information("프로그램 시작");Log.Warning("카메라 응답 지연");Log.Error("카메라 연결 실패");이 코드는 프로그램에서 발생한 일을 기록하는 로그(Logging) 기능이다.그런데 로그를 남기기 위해 반드시 Serilog라는 라이브러리를 설치해야 할까?C#에서 제공하는 Console.WriteLine()이나 Debug.WriteLine()을 사용하면 안 되는 것일까?또한 로그를 기록하면 프로그램이 느려지지는 않을까?Serilog는 C#과 .NET 프로그램에서 로그를 체계적으로 기록하고 관리하도록 도와주는 외부 라이브러리다.Serilog를 반드시 사용해야 하는 것은 아니다. 하지만 프로그..

2026. 11. 5.
C# [C#] Func란? delegate와 차이부터 실무 활용까지

C# 프로그램을 개발하다 보면 다음과 같은 코드를 볼 수 있다.C#Func calculate = (a, b) => a + b;처음 보면 Func가 무엇인지, 왜 int가 세 번 나오는지 이해하기 어렵다.또한 Func를 배우다 보면 델리게이트(Delegate)와 람다식(Lambda Expression)이라는 용어도 등장한다.이 세 가지는 서로 관련이 있지만 같은 개념은 아니다.먼저 핵심부터 알아보자.Func는 C# 키워드가 아니라 .NET에서 미리 제공하는 제네릭 델리게이트 형식이다.쉽게 말하면 메서드를 변수처럼 보관하거나 다른 메서드에 전달할 수 있도록 도와주는 도구다.이번 글에서는 Func가 왜 필요한지, 직접 선언하는 델리게이트와 무엇이 다른지, 실제로 어떤 상황에서 사용하는지 알아본다.예제는 Vis..

2026. 11. 5.
C# [C#] NuGet 패키지란? 개념부터 설치와 활용까지

C#으로 프로그램을 개발하다 보면 다음과 같은 이름을 자주 볼 수 있다.NuGetNuGet PackageNuGet Package ManagerNewtonsoft.JsonSerilogOpenCvSharpVisual Studio 2022에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하면 NuGet 패키지 관리라는 메뉴도 볼 수 있다.그런데 NuGet은 정확히 무엇일까?왜 다른 개발자가 만든 라이브러리를 설치할 때 사용하는 것일까?또한 DLL 파일을 직접 추가하는 것과 NuGet 패키지를 설치하는 것은 무엇이 다를까?NuGet은 .NET 프로그램에서 필요한 라이브러리와 개발 도구를 쉽게 설치하고 관리하도록 도와주는 패키지 관리 시스템이다.이번 글에서는 NuGet의 개념부터 DLL과의 차이, Visual Studi..

2026. 11. 5.
C#/C# 주니어 [C# 주니어 Day03] Template Method와 장치 상태

1. 오늘 목표완료 기준Template Method를 "순서는 부모가, 내용은 자식이"라고 설명하고 OmniSight에서 3곳 이상 찾을 수 있다.DeviceBase의 Initialize/Start/Stop/Dispose가 상태를 어떻게 바꾸는지 상태 그림으로 그렸다.MiniSight DeviceBase를 작성하고, 일부러 OnStart에서 예외를 던져 Faulted가 되는 것을 디버거로 봤다.최소분량: 2, 3, 4, 6확장분량: Kata 확장 과제, 조건부 중단점/Tracepoint2. 🧒 초1 비유라면 끓이기 순서표를 엄마(부모 클래스)가 정했다.물 끓이기 → 2. 면 넣기 → 3. 스프 넣기 → 4. 불 끄기신라면이든 짜파게티든(자식 클래스) 1번과 4번은 똑같다. 2, 3번만 자기 방식으로 한..

2026. 11. 5.
C# [C#] readonly 키워드 쉽게 이해하기 - const와 차이점

C# 프로그램을 개발하다 보면 다음과 같은 코드를 자주 볼 수 있다.C#private readonly string _ipAddress;private readonly object _syncObj = new object();여기서 readonly는 무엇을 의미할까?readonly는 처음에 정한 값을 객체 생성 이후에 다시 대입하지 못하도록 제한하는 키워드다.쉽게 말하면 연필로 쓴 이름표와 네임펜으로 쓴 이름표의 차이와 비슷하다.이번 글에서는 readonly의 기본 개념부터 const와의 차이, 실제 WinForms 및 머신비전 프로그램에서 사용하는 방법까지 알아본다.기본 내용은 .NET Framework 4.7.2 / C# 7.3을 기준으로 설명한다. C# 8 이후에 추가된 문법은 뒤에서 별도로 다룬다.1...

2026. 11. 5.
C# C# if문 중괄호 필수 사용 이유와 VS2022 설정

C#에서 if문이나 for문을 작성할 때 실행할 문장이 한 줄이라면 중괄호 { }를 생략할 수 있습니다.C#if (isRunning) StartProcess();문법적으로 올바른 코드이며 정상적으로 실행됩니다. 하지만 유지보수 과정에서 실행할 문장이 추가되면 예상하지 못한 버그가 발생할 수 있습니다.C#if (isRunning){ StartProcess();}위와 같이 중괄호를 사용하는 이유는 단순히 코드 스타일을 통일하기 위해서만은 아닙니다. 조건문과 반복문의 실행 범위를 명확하게 표현하여 코드 수정 과정에서 발생할 수 있는 실수를 줄이기 위해서입니다.2014년 애플에서 발견된 goto fail 보안 취약점은 중괄호가 없는 조건문의 위험성을 보여주는 대표적인 사례입니다.이번 글에서는 애플의 ..

2026. 11. 5.
C#/로또육사오 C# .NET 8 로또 번호 분석기 만들기: 콘솔과 백테스트

이 글에서는 .NET 8 콘솔 프로그램으로 로또 당첨번호를 수집하고 분석하는 도구를 만든다. 받은 데이터를 JSON 파일로 저장하고, 최근 출현 횟수로 번호 조합을 만든다. 과거 회차에 같은 방법을 적용하는 백테스트도 구현한다.핵심은 데이터를 받아 저장하고 계산하는 프로그램의 흐름을 익히는 데 있다. HttpClient, JSON, async/await, 취소 처리를 차례로 연결한다. 로직을 LottoCore 라이브러리에 모으므로 나중에 WinForms 화면에서도 재사용할 수 있다. 동행복권 조회 부분에는 2026년 11월 4일 확인한 주소와 응답 구조를 반영했다.개발 환경과 전체 흐름예제의 개발 환경은 다음과 같다..NET 8, C# 12, Visual Studio 2022외부 패키지 없이 기본 기능만..

2026. 11. 4.
C# C# Pre-Align 기초: 좌표부터 캘리브레이션까지

종이에 네모 칸을 그리고 지우개를 올리면 매번 조금씩 다른 위치에 놓인다. 지우개가 옆으로 밀렸다면 옮겨야 한다. 비스듬하다면 돌려야 한다. 머신비전의 Pre-Align(사전 정렬)도 이와 비슷하다. 카메라로 제품의 위치와 방향을 측정한 뒤, 검사 전에 필요한 보정량을 계산한다.이 글에서는 두 개의 + 마크를 기준으로 위치와 각도를 구하는 과정을 다룬다. 좌표와 단위부터 시작해 삼각함수, 회전중심, 캘리브레이션, 행렬, 최소제곱법으로 이어 간다. 마지막에는 이 수학을 하나의 C# 콘솔 예제로 묶는다. 다 읽고 나면 두 마크의 픽셀 좌표에서 회전각과 이동량을 직접 계산하는 코드를 작성할 수 있다. WinForms 화면 제작은 2편에서 시작한다.수학 공식이 많이 나오지만 겁먹을 필요는 없다. 공식마다 손으로..

2026. 11. 4.
C#/C# 주니어 [C# 주니어 Day02] 인터페이스와 계약, SOLID, 소유권

1. 오늘 목표완료 기준"인터페이스에 의존한다"는 말을 OmniSight 예로 설명할 수 있다 (InspectionPipeline은 카메라 종류를 모른다).SOLID 5개 중 DIP, ISP, SRP를 OmniSight 코드로 하나씩 가리킬 수 있다.MiniSight Devices/Contracts.cs(IDevice, IImageSource, DeviceState, ImageFrame)를 손으로 작성했다.ImageFrame.Dispose()를 두 번 불러도 안전하다는 걸 디버거로 확인했다.최소분량: 2, 3, 4, 6확장분량: 5 Kata 전부, 7번 Watch 실험2. 🧒 초1 비유인터페이스 = 콘센트 모양 약속. 벽 콘센트(검사기)는 "구멍 두 개" 모양만 약속한다. 드라이기든 선풍기든(카메라든 ..

2026. 11. 4.
C#/C# 기초 체력 [C# 기초 B14] 패턴 없는 가짜 카메라 (Timer + B01~B13 합치기)

1. 오늘 목표지금까지 배운 키워드만으로 50줄짜리 가짜 카메라를 만든다. 디자인 패턴은 하나도 없다. 그리고 Day04가 "이 카메라를 정해진 자리에 넣은 것"이라는 걸 확인한다.2. 🧒 비유: 자동 사진기**알람 시계(Timer)**가 0.3초마다 울린다. 울릴 때마다 사진기가 찰칵하고 번호를 붙인다.찰칵할 때마다 **초인종(event)**을 눌러 "사진 나왔어요!" 하고 알린다.Main은 리모컨(CancellationToken) 불이 켜질 때까지 기다린다. 5번째 사진을 받으면 정지 버튼을 누른다.다 쓰면 알람 시계를 **반납(Dispose)**한다.3. 오늘 새 키워드 표키워드역할사용법기억할 점System.Threading.Timer정해진 간격마다 스레드 풀 일꾼이 메서드를 부른다new Time..

2026. 11. 4.
반응형