반응형 분류 전체보기77 소멸자(~EmguVision)로 GDI 리소스(Pen)를 해제하는 방식은 권장되지 않습니다. 좋은 포인트예요. 결론부터:소멸자(~EmguVision)로 GDI 리소스(Pen)를 해제하는 방식은 권장되지 않습니다.WinForms 컨트롤은 Dispose(bool disposing) 를 override 해서 관리되는 리소스는 disposing == true일 때 해제하는 표준 패턴을 따르는 게 정석이에요.소멸자(파이널라이저)는 성능에 불리하고, 호출 시점도 불확실하며, 관리 객체에 접근하면 위험합니다. → 소멸자 제거 권장.InitializeComponent() 는 디자이너가 자동 생성하는 컨트롤 초기화(자식 컨트롤 배치, 속성 바인딩, 리소스 연결, 이벤트 wiring 등) 코드가 들어가는 자리입니다. 현재 내용이 비어있어도 “디자이너 초기화 진입점”으로 남겨두는 게 맞습니다.아래에 권장 리팩토링을.. 2025. 9. 9. ScrollableControl을 상속받았다는 건, “이 컨트롤은 화면(뷰포트)보다 큰 가상의 캔버스를 갖고, 자동 스크롤바/스크롤 오프셋 관리까지 운영체제가 대신 해주는 컨테이너”라는 뜻입니다. ScrollableControl을 상속받았다는 건, “이 컨트롤은 화면(뷰포트)보다 큰 가상의 캔버스를 갖고, 자동 스크롤바/스크롤 오프셋 관리까지 운영체제가 대신 해주는 컨테이너”라는 뜻입니다.(= 스크롤바가 필요할 때 자동으로 생기고, 스크롤 위치에 맞춰 그리기 좌표가 바뀌는 베이스 클래스를 쓰는 것)무엇을 얻나? (핵심 기능)AutoScroll / AutoScrollMinSize / AutoScrollPositionAutoScroll = true로 켜면, AutoScrollMinSize에 “가상 캔버스 크기”를 설정해 스크롤바를 자동 표시.현재 스크롤 오프셋은 AutoScrollPosition으로 읽음(주의: 반환값은 음수).표준 스크롤 UX마우스 휠, 스크롤바 드래그, 키보드 스크롤 등 WinFo.. 2025. 9. 9. Emgu.CV.InputArray, Emgu.CV.IInputArray, Emgu.CV.Mat 아래는 EmguCV에서 자주 만나게 되는 Emgu.CV.InputArray, Emgu.CV.IInputArray, Emgu.CV.Mat 세 타입을 초보자도 헷갈리지 않도록 정리한 설명입니다.핵심은 “데이터 그릇(Mat)” vs “함수 인자 어댑터(IInputArray/InputArray)”의 역할 분리예요.전체 그림 (왜 3가지?)OpenCV(C++)에는 많은 함수들이 인자로 cv::_InputArray를 받습니다. 이는 cv::Mat, cv::UMat, cv::Matx, std::vector 등 여러 형태의 데이터를 한 번에 받기 위한 어댑터 타입입니다.EmguCV는 이를 .NET에 옮겨오면서:IInputArray: “이건 입력으로 읽을 수 있어요”를 나타내는 인터페이스InputArray: 위 인터페이.. 2025. 9. 8. NumberOfChannels로 컬러/그레이 판단하기 2) NumberOfChannels로 컬러/그레이 판단하기m_bColor = mat.NumberOfChannels >= 3;채널(channel) 은 “픽셀을 구성하는 값의 개수”입니다.1채널: 보통 그레이스케일 (밝기만 존재)3채널: 보통 컬러(BGR) ← OpenCV/EmguCV는 기본이 BGR 순서4채널: 보통 컬러 + 알파(BGRA) (투명도 포함)2채널: 드물지만 그레이 + 알파 같은 변종이 있을 수 있음그래서 **채널 수가 3 이상이면 보통 “컬러로 취급”**해요.(3채널이면 컬러, 4채널도 컬러 + 알파이므로 컬러 취급이 맞습니다.)반대로 1채널은 그레이스케일이므로 m_bColor = false.초보자용 직관“한 픽셀에 숫자 1개만 있으면(예: 157) 밝기만 있는 흑백”“한 픽셀에 숫자 3개.. 2025. 9. 8. EmguCV 이미지 깊은 복사(Deep Copy) vs 얕은 복사(Shallow Copy) 1) 깊은 복사(Deep Copy) vs 얕은 복사(Shallow Copy)얕은 복사 (clone == false)뜻: 픽셀 데이터를 새로 복제하지 않고 같은 픽셀 버퍼를 공유합니다. 보통은 헤더/메타데이터(크기, 타입, 포인터)만 “복사”하고 실제 바이트 배열은 공유해요.장점: 거의 즉시 끝나고 메모리 추가 사용이 없음(아주 빠름).주의점:원본/사본이 서로 영향을 줍니다. 한쪽에서 픽셀을 바꾸면 다른 쪽에도 그대로 반영돼요.수명(Dispose) 얽힘: 같은 버퍼를 공유하므로 원본이 해제되면 사본도 무효가 될 수 있습니다.특히 지금 코드처럼 clone == false에서 내부에 같은 Mat 인스턴스를 보관하면, 호출자가 source.Dispose() 해버리면 내부도 같이 무효가 됩니다.→ 얕은 복사를 쓸.. 2025. 9. 8. EnsureNotDisposed()가 맡는 역할 다음은 리팩터링된 EmguImage 클래스 안에서 EnsureNotDisposed()가 맡는 역할을 정확하고 자세히 정리한 설명입니다.EnsureNotDisposed()의 역할1) 무엇을 하는 함수인가?목적: 이미 Dispose()가 호출되어 더 이상 유효하지 않은 객체에 대해, 추가 사용을 즉시 차단합니다.방법: 내부 플래그(예: m_disposed)를 확인해 true면 **ObjectDisposedException**을 던집니다.효과: 후속 코드가 네이티브 리소스(Mat, Bitmap)에 접근하기 전에 빠르게 실패(fail-fast) 하여, 메모리 접근 위반/핸들 오류/프로세스 크래시 같은 치명적 문제를 예방합니다.[MethodImpl(MethodImplOptions.AggressiveInlining.. 2025. 9. 8. CvInvoke.Imread를 선택한 이유: Mat 중심 수명관리·정밀도 보존·중간 객체 제거 요점부터 정리하면:둘 다 “파일 → OpenCV 메모리”로 읽어 들인다는 점은 같습니다.차이는 어떤 래퍼를 거치느냐( Image vs Mat), 수명/복제 전략, 지원하는 깊이/채널 옵션에서 큽니다.리팩터링에서는 직접 Mat을 소유하도록 CvInvoke.Imread를 선택해, 불필요한 중간 객체/복사를 줄이고 수명 관리(Dispose)를 단순화했습니다.아래에 장단점 비교와 상황별 선택 가이드, 그리고 레거시 방식으로도 안전하게 쓰는 코드 대안을 정리했습니다.1) 방식별 개념 차이A. CvInvoke.Imread(filePath, mode) → Mat파일을 바로 Mat 으로 읽어옵니다.이 Mat이 데이터를 직접 소유(reference counted)하고, 이 객체를 우리 클래스가 관리/해제합니다.Imrea.. 2025. 9. 8. https://github.com/basler/pypylon/issues/446 https://github.com/basler/pypylon/issues/446 2025. 9. 4. GC.SuppressFinalize(this); 짧게 말해: 이 객체에 파이널라이저(종종 ~Basler() 형태)가 실행될 필요가 없도록 GC에 “알려서” 불필요한 비용과 이중 해제를 막기 위해 씁니다.좀 더 자세히:**파이널라이저(Finalizer)**가 있는 객체는 GC가 바로 치우지 않고 Finalization Queue에 올린 뒤, 별도 스레드에서 파이널라이저를 호출합니다.우리가 Dispose()에서 이미 모든 정리를 끝냈다면, 파이널라이저는 더 이상 할 일이 없고 오히려 성능만 떨어뜨리거나(추가 단계) 이중 해제 위험이 생길 수 있어요.GC.SuppressFinalize(this)는 “이 객체는 이미 깔끔히 정리됐으니 파이널라이저를 호출하지 마”라고 GC에게 표시하는 호출입니다. 즉, 파이널라이저 큐에서 제거합니다.그럼 우리 코드에서 꼭 필요.. 2025. 9. 4. C#에서 쓰는 Emgu CV vs OpenCvSharp를 핵심 차이·장단점 위주로 깔끔히 정리 TL;DRCUDA/GPU, 상용 지원, MAUI/Unity까지 안정적으로 가려면 Emgu CV가 유리(단, 일부 기능은 유료/상용 런타임 필요). (emgu.com)전부 오픈소스/간단 설치/네이티브 OpenCV API 느낌을 원하면 OpenCvSharp이 편함(공식적으로 CUDA 미지원). (GitHub, NuGet, SourceForge)한눈 비교항목 Emgu CV OpenCvSharp정체.NET용 OpenCV 래퍼(기업 운영, 듀얼 라이선스).NET용 OpenCV 래퍼(커뮤니티, BSD-3)설치/패키지Emgu.CV + OS별 runtime 패키지 (Windows는 Emgu.CV.runtime.windows)OpenCvSharp4 + OS별 runtime (OpenCvSharp4.runtime.win .. 2025. 9. 4. 이전 1 2 3 4 ··· 8 다음 반응형