목록전체 글 (203)
JAN's History
1. 스마트 포인터unique_ptr동적으로 생성된 객체의 소유권과 수명을 자동으로 관리하는 스마트 포인터.auto p = std::make_unique(10); 의미:Heap에 int 생성 ↓unique_ptr이 소유 ↓p가 scope를 벗어남 ↓자동으로 객체 삭제 따라서 직접:delete 할 필요가 없다.중요한 점make_unique를 무조건 사용하는 게 아니다.int x = 10; 처럼 지역변수로 충분하다면 굳이 Heap에 만들 필요가 없다.unique_ptr의 핵심은 Heap 자체가 아니라 ownership(소유권) 관리다.2. vectorstd::vector v; 크기가 동적으로 변할 수 있는 배열.v.push_back(10);v.push_back(20);v.push_..
반도체 SW / 머신비전 학습을 시작하면서 C++ 메모리 관리 → OpenCV 이미지 데이터 구조를 연결해서 학습했다.처음에는 단순히 new = Heap이라고 생각했지만, 학습하면서 동적이라는 것과 Heap이라는 것은 다른 개념이라는 것을 이해했다.1. Stack과 HeapStack지역 변수처럼 함수의 실행 범위에 따라 자동으로 생성/소멸되는 데이터가 주로 저장된다.void foo(){ int x = 10;} foo()가 종료되면 x도 자동으로 정리된다.Heap실행 중에 필요한 메모리를 직접 확보할 수 있는 영역이다.int* p = new int(10); 개념적으로:Stack Heap┌─────────┐ ┌─────────┐│ p ..
오늘은 OpenCV를 이용해 간단한 머신비전 검사 Pipeline을 구현해봤다.단순히 이미지를 처리하는 것에서 끝나는 것이 아니라, 이미지에서 물체를 검출하고 크기를 측정한 뒤 정상(OK) / 불량(NG)을 판단하는 과정까지 만들어보는 것이 목표였다. 전체 그림은 아래와 같음[카메라] ↓Camera Frame ↓Gray ↓Binary ↓Contour ↓Object 분석 ↓크기 측정 ↓OK / NG 판정먼저 카메라로 영상을 받아 Grayscale로 변환하고, threshold()를 이용해 밝기 기준으로 이미지를 검정/흰색의 Binary 이미지로 변환했다.threshold(gray, binary, 127, 255, THRESH_BINARY);이후 findCo..
오늘은 OpenCV로 카메라 영상을 받아 기본적인 영상처리 파이프라인을 만들어봤다.1. Camera에서 Frame 가져오기VideoCapture cap(0);Mat frame;while (true){ cap >> frame; imshow("Camera", frame); if (waitKey(1) == 27) break;}VideoCapture cap(0)은 기본 카메라를 연결하고, cap >> frame을 통해 현재 화면을 한 장씩 가져온다.즉 영상은 결국 Frame이 계속 들어오는 구조라고 이해했다.2. BGR → GrayMat gray;cvtColor(frame, gray, COLOR_BGR2GRAY);카메라의 컬러 이미지는 BGR 3채널로 구성되어 있다. 이를 Grays..
오늘은 OpenCV와 YuNet을 이용해 카메라에서 얼굴의 코 위치를 추적하고, 코의 움직임을 선으로 그리는 프로젝트를 진행했다!(이론 공부하다가 갑자기 루즈해져서 초 미니 플젝을 진행하기로함)1. YuNet 모델 연결face_detection_yunet_2023mar.onnx 모델을 사용하고, OpenCV의 FaceDetectorYN을 통해 얼굴 검출을 수행했다.https://huggingface.co/opencv/face_detection_yunetPtr detector =FaceDetectorYN::create(...); FaceDetectorYN은 YuNet의 출력 형식을 OpenCV에서 처리하기 쉽게 제공하는 API다.2. 얼굴 검출Mat faces;detector->detect(frame, f..
이미지 데이터는 결국 픽셀들의 집합이며, 컬러 이미지의 픽셀은 일반적으로 BGR 3개의 값으로 구성된다.Vec3b pixel;pixel[0] // Bpixel[1] // Gpixel[2] // R OpenCV의 Mat에서 픽셀에 접근하는 대표적인 방법은 4가지가 있다.1. data — 버퍼 직접 접근img.data[y * img.step + x * img.elemSize() + channel] data : 이미지의 실제 메모리 버퍼step : 한 row에서 다음 row까지의 바이트 크기elemSize() : 픽셀 하나의 바이트 크기channel : BGR 채널예시..unsigned char b = img.data[y * img.step + x * img.elemSize() + 0]; 장점: 메모리를..
1. 오늘 배운 전체 구조오늘 배운 걸 한 줄로 묶으면:OpenCV의 Mat을 어떻게 다루는가? │ ├── 비디오에서 프레임 가져오기 │ ↓ │ VideoCapture │ ├── 이미지 일부 가져오기 │ ↓ │ Rect / ROI │ └── 이미지 복사하기 ↓ clone / copyTo "이게 원본을 같이 바라보는 건가? 아니면 데이터를 새로 복사하는 건가?"2. 비디오 재생오늘 앞에서 배운:VideoCapture capture(".\\video.avi");Mat frame;while (1){ cap..
추억이 새록새록 ..대학교 1학년때 깔았던 비쥬얼 스튜디오를 새롭게 깔게되다니...1. 전체적인 그림OpenCV에서 이미지는 결국 픽셀들의 숫자 데이터다.카메라 ↓Frame(이미지) ↓Mat ↓픽셀들의 숫자 ↓픽셀을 읽고/계산 ↓Sobel 같은 영상처리 ↓결과 이미지즉 지금 배우는 Mat, at(), ptr(), data, buffer 등은 전부 이미지 데이터를 어떻게 저장하고 접근하는지와 관련되어 있다.2. MatMat은 OpenCV에서 이미지/행렬 데이터를 관리하는 클래스다.Mat img = Mat::ones(3, 3, CV_64F);1 1 11 1 11 1 1 3. 픽셀 접근이미지를 처리하려면 픽셀 값을 읽거나 수정해야 한다.at()특정 픽셀에 편하게 접근한다.img.at(y, x);→ "y행 x열..