Knowhow/Vision 46

Obj file의 manifold/non-manifold 구분

mesh 데이터를 이용한 무언가를 진행할 때, 보통 mesh가 manifold한지, 아닌지 구분하는 작업이 필요하고 non-manifold mesh라면 해당 vertex와 face를 제거하든지 해서 전처리를 한 뒤에 사용하게 된다. 특히, 캐드에서나 3D graphic tool에서 non-manifold mesh를 그대로 사용한다면, 냅다 오류가 나거나 구멍이 뚫려있는 mesh를 볼 수 있다. 그래서 가장 대표적으로 mesh를 저장하는 데이터 포맷인 obj file에 대해서 mesh가 manifold한지 판단하는 방법 및 코드를 정리해보고자 한다. Manifold 먼저, 지금까지 내가 공부하고 그리고 직관적으로 해석한 바로 manifold mesh가 뭔지 정리해보자면, mesh의 모든 edge를 2개 이..

Knowhow/Vision 2022.06.30

3D mesh voxelization

3D mesh가 차지하고 있는 voxel 공간, 즉, occupancy volume을 구하기 위해 mesh를 voxel화 하는 작업이 필요할 때가 있다. vertex와 face로 구성된 mesh로부터 voxel을 얻어내는 것이 간단해보이지만 막상 구현해보면 꽤나 복잡하고 동작 시간도 오래 걸린다. 이 작업을 아주 간단하게, 그리고 아주 빠르진 않지만 직접 구현하는 것보단 빠르게 해결할 수 있는 방법이 있다. binvox라는 프로그램을 사용하는 것인데, 아래 링크에 접속해서 executable 파일을 OS 맞게 받은 후 실행시키면 된다. https://www.patrickmin.com/binvox/ 한 개인이 박사 과정 중에 구현해서 공유한 것인데, 유용하게 사용할 수준이다. 단, 모든 axis dimen..

Knowhow/Vision 2022.06.17

Opencv large FoV image undistortion

카메라 intrinsic calibration을 마치면 보통 K matrix와 distortion coefficient를 얻는다. K matrix의 경우, fx, fy, cx, cy로 구성된 3x3 matrix일 것이고, distortion coefficient는 일반적인 화각의 카메라라면 5개, 그 외 다른 광각이라면 최대 14개까지 나올 것이다. 그리고 이 값을 사용해서 다음과 같은 함수를 통해 이미지의 왜곡을 펼치고 왜곡이 보정된 이미지 및 포인트를 사용하게 된다. image_ud = cv2.undistort(image, K, dist) point_ud = cv2.undistortPoints(img_pt, K, dist, P=K) 하지만 광각 이미지의 경우, 위 함수를 통해 얻은 undistorte..

Knowhow/Vision 2022.06.16

Opencv multi webcam 사용 시 인식 확인

opencv에서 라이브 웹캠을 2개 이상 사용하고자 할 때, 보통 아래와 같이 접근한다. import cv2 cam0 = cv2.VideoCapture(0) cam1 = cv2.VideoCapture(1) ... camN = cv2.VideoCapture(N) #N is a camera index 이 때, 분명 카메라 N대는 제대로 연결되어 있는데 다음과 같은 오류가 나면서 인식이 안되는 상황이 있을 수 있다. [ WARN:0@0.132] global /io/opencv/modules/videoio/src/cap_v4l.cpp (889) open VIDEOIO(V4L2:/dev/video1): can't open camera by index 이 문제의 원인은 코드에 사용한 camera index와 실제 ..

Knowhow/Vision 2022.06.13

Opencv webcam resolution control

opencv로 웹캠의 해상도를 변경하고 싶을 때, 보통 아래와 같은 코드로 변경한다. import cv2 cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080) 그런데 위 코드가 동작하지 않을 때가 있는데 그 이유는, 1. 카메라가 지원하지 않는 해상도일 경우, 2. 카메라가 지원하는 해상도이지만, pixel format이 안 맞을 경우 1. 카메라가 지원하지 않는 해상도일 경우는 당연히 안된다. 2. 카메라가 지원하는 해상도이지만 그래도 안되는 경우는 pixel format이 YUYV인지, MJPG인지 확인할 필요가 있다. uvcdynctrl -f Linux일 경우, ..

Knowhow/Vision 2022.06.13

Opencv 광각 (Large FoV) 카메라 intrinsic calibration

Opencv 를 이용해서 카메라를 intrinsic calibration하고자 할 때, 보통은 아주 쉽게 다음의 함수를 이용해서 할 수 있다. import cv2 mtx = None dist = None rvecs = None tvecs = None obj_points = TARGET_3DPOINT img_points = TARGET_2DPOINT RMSE, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, (img_w, img_h), mtx, dist, rvecs, tvecs) 하지만 광각 카메라로 취득한 이미지를 대상으로 intrinsic calibration을 시도할 때, 위 함수를 그대로 사용할 경우, reprojectio..

Knowhow/Vision 2021.11.22
1 2 3 4 5