컴공지식/컴퓨터비전
-
평행선으로 이미지를 보정하는 방법컴공지식/컴퓨터비전 2024. 11. 11. 20:41
평행선 정보 확인: 주어진 왼쪽 이미지에서 파란색으로 표시된 두 선을 봐라. 이 선들이 실제로는 평행하지만 사진에서는 왜곡 때문에 기울어져 보여. 이런 왜곡을 사다리꼴 왜곡이라고 한다.평행선의 소실점 찾기: 평행한 선들이 기울어져 있다면, 이 선들을 연장했을 때 소실점(vanishing point)에서 만난다는 걸 이용할 수 있다. 소실점은 왜곡을 수정하는 데 필요한 기준이 되니까, 이 두 선을 연장해서 교차하는 점을 찾는다.이미지 변환 행렬 계산: 소실점과 평행선 정보를 사용해 이미지의 원근 왜곡을 보정하는 투영 변환(프로젝티브 트랜스폼)을 할 수 있다. 이미지 처리 도구(OpenCV 등)를 사용해서, 이 소실점 정보를 이용한 변환 행렬을 계산해주면 된다.투영 변환 적용: 이제 계산된 변환 행렬을 이미..
-
퍼스펙티브 변환 과정 예시컴공지식/컴퓨터비전 2024. 11. 11. 20:39
종이의 왜곡된 모서리들을 잡아당겨서 직사각형으로 만들면 된다1. 코너 점 찾기:먼저 왼쪽 이미지에서 네 개의 코너 점을 찾아야 한다. 이미지의 좌상단, 우상단, 좌하단, 우하단에 해당하는 점들을 잡아내는거다.2. 대상 점 설정하기:변환하고 싶은 목표 위치를 설정해야 한다. 원하는 모양이 직사각형이니까, 새 이미지에서 코너 점들을 평평한 직사각형 형태(예를 들어, (0, 0), (width, 0), (width, height), (0, height))로 지정해주면 된다.3. 변환 행렬 계산:이제 OpenCV 같은 라이브러리를 사용해서 원래 점들(왜곡된 모서리)에서 대상 점들(직사각형 모서리)로 변환하기 위한 행렬을 계산한다. 이걸 호모그래피 행렬이라고 부른다. 이 행렬이 이미지 왜곡을 수정하는 역할을 하는..
-
Projective transformation컴공지식/컴퓨터비전 2024. 11. 9. 22:42
프로젝티브 변환은 8개의 자유도를 가지며, 네 점 간의 크로스 비율만 유지되는 변환이다. 나머지 각도, 거리, 평행성은 변할 수 있다. 무한대 직선이 유한한 곳으로 이동하는 변환이다. 프로젝티브 변환(호모그래피)은 한 평면의 점을 다른 평면의 점으로 변환해서 서로 다른 각도에서 찍은 평면 이미지의 원근 왜곡을 보정하거나 동일한 평면으로 맞춰보는 데 유용한 방법이다. 호모그래피는 3x3 행렬로 표현되는 평면 변환이며, 한 직선 위의 점들이 변환 후에도 같은 직선 위에 유지되는 특징이 있다.프로젝티브 변환을 적용하려면 최소 네 쌍의 대응점이 필요하고, 이를 통해 3x3 행렬의 여덟 개 요소를 계산해 변환을 적용할 수 있다. getPerspectiveTransform 함수는 네 쌍의 대응점을 이용해 3x3 투..
-
YOLO 모델 로딩하는 코드컴공지식/컴퓨터비전 2024. 11. 4. 21:42
OpenCV 라이브러리를 사용해서 YOLO (You Only Look Once)라는 객체 탐지 모델을 불러올거다.readNetFromDarknet 함수를 써서 YOLO 모델을 로드한다. // YOLO 모델 설정 파일과 가중치 파일 경로 지정 String modelConfiguration = "yolov2.cfg"; String modelBinary = "yolov2.weights"; // YOLO 모델 로드 Net net = Dnn.readNetFromDarknet(modelConfiguration, modelBinary); // 이미지 프레임을 딥러닝 모델이 처리할 수 있는 blob 형태로 변환 Mat inputBlob = Dnn.blobFromImage(frame, 1 / 255.0, new Siz..
-
Optical Flow (광류 추적) 코드컴공지식/컴퓨터비전 2024. 10. 28. 22:28
KLT 알고리즘 기반 광류 추적 코드 #include #include using namespace std; using namespace cv; void DrawTrackingPoints(vector &points, Mat &image) { for (int i = 0; i circle(image, points[i], 3, Scalar(255, 0, 0), 2); } } int main() { VideoCapture cap(0); if (!cap.isOpened()) { cout return 0; } Mat currImage, prevImage, frame; vector prevPoints, currPoints;..
-
추적 (Tracking) 코드컴공지식/컴퓨터비전 2024. 10. 28. 22:27
마우스로 드래그하여 추적 영역을 설정한다.MeanShift / CamShift 적용된거다. #include #include using namespace std; using namespace cv; struct CallbackParam { Mat frame; Point pt1, pt2; Rect roi; bool drag = false; bool updated = false; }; void onMouse(int event, int x, int y, int flags, void* param) { CallbackParam *p = (CallbackParam *)param; if (event == EVENT_LBUTTONDOWN) { p->pt..
-
얼굴 인식 코드컴공지식/컴퓨터비전 2024. 10. 28. 22:20
OpenCV를 이용한 얼굴 인식 코드웹캠을 사용해서 실시간으로 얼굴을 인식해 준다. #include #include using namespace std; using namespace cv; int main() { CascadeClassifier face_classifier; Mat frame, grayframe; vector faces; VideoCapture cap(0); if (!cap.isOpened()) { cout return -1; } face_classifier.load("haarcascade_frontalface_alt.xml"); while (true) { cap >> fram..