본문 바로가기

Programming/OpenCV

(34)
[OpenCV] Image Crop OpenCV 에서 ROI 만큼 이미지를 Crop 시키는 방법은 아래와 같다. 간단한 방법인데, 잊지않으려고 정리한다. Python 구현 # x, y, w, h refers to the ROI for which the image is to be cropped. img = cv2.imread('test.jpg') cropped_img = img[y: y + h, x: x + w] C++ 구현 Mat img = cv::imread("test.jpg"); Rect bounds(0,0,img.cols,img.rows); Rect r(x,y,width,height); // partly outside Mat roi = img( r & bounds ); // cropped to fit image 위와 같이 구현하면 아..
[OpenCV] 동영상 재생 + 프레임 측정 + 적응적 이진화 + 캐니에지 + 컨투어링 + 모멘트 + putText 동영상 재생 후 프레임을 측정하고 적응적 이진화를 통해 이진화를 수행한다. 그 다음, 캐니 에지로 엣지를 따고나서 컨투어링을 수행하여 탐지된 객체의 가장자리를 그리고, 컨투어링을 통해 면적을 계산한다. 다음으로, 객체를 둘러 쌓는 바운딩 박스(Bounding Box)를 통해 객체의 Width, Height를 구하는 예제이다. 마지막으로 계산한 면적, 너비, 높이를 putText를 통해 화면에 표시한다. #include #include #include "opencv2\opencv.hpp" using namespace cv; using namespace std; int main(int argc, char* argv[]) { Mat matOrg; Mat matOut; long totalFrames = 0; c..
[OpenCV] 라벨링 개념, 객체 카운팅 + 색상 추출 + 라벨링 예제 라벨링(Labeling)이란? 이진화 한 이미지에서 객체를 각각 분별하기 위해 인접한 픽셀 값들끼리 그룹화하여 번호를 매긴 것이다. 즉, 인접한 화소들을 묶어 하나의 객체로 판단하는 방식이며 "같은 번호"를 부여한다. 라벨링은 4방향 라벨링과 8방향 라벨링으로 이루어져 있으며, 이는 OpenCV 3.0에 함수로 구현되어있다. 라벨링은 좌측 상단부터 우측 상단 방향까지 이동하면서 번호를 부여한다. 첫 행의 번호 부여가 끝나면 다음 줄 좌측 부터 우측 방향까지 쭉~ 마지막 픽셀까지 번호를 부여한다. 4방향 라벨링은 한 픽셀을 중심으로 십자가 모양으로 인접한 픽셀을 그룹화한다. ↑ ← → ↓ 1 1 2 2 2 2 3 3 3 3 3 4 4 4 4 4 4 5 6 6 6 7 8방향 라벨링은 십자가 모양에 대각선 방..
[OpenCV] putText 폰트 c++ 참고자료 : Contour & Bounding Box 예제 1. putText 사용법 void putText(Mat& img, const string& text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false ) 2. putText 매개변수 img – Image.text – Text string to be drawn.org – Bottom-left corner of the text string in the image.font – CvFont structure initialized using InitFont().fontFace – Font ty..
[OpenCV] 특정 픽셀 값 접근하기 OpenCV 특정 픽셀 값 접근하기 아래 예제는 원본 이미지 A로부터 어떠한 영상처리를 거친 이미지 B의 검출 영역인 흰색 부분을 원본 이미지 A에 다시 파란색으로 그리는 예제이다. 원본 이미지 A 마스크 이미지 B 결과 이미지 C #include int main() { Mat dst = imread("image/lesion.jpg"); // 원본 이미지 A Mat src = imread("image/mask.jpg"); // 마스크 이미지 B for (int y = 0; y < src.rows; ++y) { for (int x = 0; x < src.cols; ++x) { if (src.at(y, x) == 255) { // 마스크 이미지의 흰색 픽셀이면 dst.at(y, x)[0] = 255; // ..
[OpenCV] image inpaint 함수 (object removal or region filling) 이미지에서 지우고 싶은 선 또는 잡음을 포함한 객체를 지우고, 주변 픽셀이 가지는 색상으로 지워진 부분을 채우고자 할 때 OpenCV의 inpaint 함수를 사용 할 수 있다. (여기서는 OpenCV 3.4.2 버전을 사용하였다.) inpaint 함수 형식 // C++ 형식 void cv::inpaint(InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, int flags) // Python 형식 dst = cv.inpaint(src, inpaintMask, inpaintRadius, flags[, dst]) inpaintMask 는 8비트 1채널 이미지(흑백이미지)를 사용해야한다. inpaintRadius 는 알고..
[OpenCV] 동영상 저장 및 파일명 지정 (to_string) 오랜만에 올리는 OpenCV 포스팅 사실 기록용이다 동영상 저장 및 파일명 지정하기 (video(1), video(2), ...) 소스코드는 일부 입니다. VideoWriter leftWriter, rightWriter; int codec = CV_FOURCC('P', 'I', 'M', '1'); // select desired codec (must be available at runtime) double fps = cam.camera_capture[0]->get(CAP_PROP_FPS); // frame rate of the created video stream //cout
[OpenCV] Image Denoising Image Denoising 영상처리 분야에서 중요한 부분이며 가장 많이 쓰이게 되는 부분중 하나로 이미지 노이즈 제거를 뽑을 수 있겠다. 이미 opencv에 이미지 노이즈를 제거하는 많은 알고리즘들과 함수들이 존재한다. 그 중 알아볼 것은 Non-local means Denoising 알고리즘이다. 이 전에 나왔던 기술들인 Gaussian blurring, Median Blurring 등과 같은 많은 이미지 평활화 기법을 보았으며, 노이즈가 조금 있는 영상에 대해 어느정도 효과를 보일 수 있었다. 또한 이러한 기능에서 각 픽셀 주변 작은 이웃 화소를 통해 중심요소를 대체해버리는 등 가우시안 기법, 평균, 중앙값 등을 이용한 연산을 수행해 왔다. 즉, 픽셀에서 노이즈 제거는 그 근처에 국한되었다는 것이다..
[OpenCV] Bilateral Filter 적용하기 Bilateral Filter OpenCV에서 대표적인 필터로는 blur, GaussianBlur, medianBlur 그리고 BilateralFilter 가 있다. 이 필터는 선형으로 처리되지 않고, 엣지와 노이즈를 줄여주어 부드러운 영상이 만들어지게 된다. 변수의 값이 크면 클수록 픽셀에 미치는 영향이 많아져 가중치가 커지게 된다. bilateralFilter(src, dst, d, sigmaColor, sigmaSpace); src : 입력 이미지 dst : 출력 이미지 d : 필터링에 이용하는 이웃한 픽셀의 지름을 정의 불가능한경우 sigmaspace 를 사용 sigmaColor : 컬러공간의 시그마공간 정의, 클수록 이웃한 픽셀과 기준색상의 영향이 커진다 sigmaSpace : 시그마 필터를 조..
[OpenCV] SimpleBlobDetector 을 이용한 Blob Detection OpenCV에 내장되어있는 SimpleBlobDetector() 이용하여 간단한 Blob Detection을 수행해 보았다. 이 클래스는 features2d.hpp 에 내장되어있다. 그리고 Params 변수를 조절하여 원하는 값을 넣을 수 있고, 그 값으로는 다음과 같다. 자세한 사항은 레퍼러스를 참조해 보도록 한다. By color. This filter compares the intensity of a binary image at the center of a blob to blobColor. If they differ, the blob is filtered out. Use blobColor = 0 to extract dark blobs and blobColor = 255 to extract light..