728x90

코딩/C, C++ 22

[opencv와 C++로 컴퓨터 비전] 영상 재매핑 처리

▶ 영상 재매핑 처리 오늘은 영상의 화소를 옮겨 영상의 모습을 변경하는 방법에 대해 공부해보자. 화소의 값을 바꾸지 않고 화소의 위치를 새로운 위치에 재매핑 할 것이다. 두 가지를 해볼 것인데 하나는 영상에 물결 효과를 넣는 것이고, 또 다른 하나는 영상을 좌우반전시키는 것이다. 1. 원본 영상 읽기 및 띄우기2. 원본 영상에 물결 효과 넣기 - cv::remap 함수3. 원본 영상을 좌우반전시키기 - cv::remap 함수 코드는 아래와 같다. #include #include #include #include //cv::remap 함수 사용을 위해 필요 void wave(const cv::Mat &image, cv::Mat &result); // 물결 효과 함수void flip(const cv::Mat ..

코딩/C, C++ 2018.03.21

[opencv와 C++로 컴퓨터 비전] 두 개의 영상 가중합하기

▶ 두 개의 영상 가중합 하기 영상끼리 더해주거나 빼주거나 곱해주거나 나누어주는 것이 가능하다. 오늘은 두 영상을 가중합하는 것을 해보도록 하겠다. 화창한 이미지에 비 이미지를 더해서 마치 비가 오는 것처럼 만들 것이다. 1. 두 개의 영상 읽기2. 영상 가중합- cv::addWeighted 함수3. 또 다른 방식으로 영상 가중합4. BGR중에 G, 초록 채널에만 영상 가중합(초록비 내리게 함)- cv::split 함수, cv::merge 함수 코드는 아래와 같다. #include #include #include #include // cv::cvtColor 함수를 사용하기 위해 필요. int main(){/* 2개의 컬러 이미지 가중합 */cv::Mat img1 = cv::imread("marco.jpg..

코딩/C, C++ 2018.03.19

[opencv와 C++로 컴퓨터 비전] 영상 선명하게 만들기

▶ 영상 선명하게 만들기 사진을 찍다보면 살짝 흔들리거나 초점이 잘 안 맞아서 뿌연 영상이 찍힐 때가 종종 있다. 이런 영상을 선명하게 만드는 기법 중에 가장 간단한 것은 영상에 라플라시안 커널로 필터링해주는 것이다. 그러면 밝기값이 센 픽셀은 더 세게, 약한 픽셀은 더 약하게 해줌으로 결과적으로 엣지가 더 두드러지게 된다. cv::filter2D 함수를 이용하면 쉽게 필터링할 수 있지만, 좀 더 영상의 구조와 특징을 이해하기 위해서 책에서 소개한 방식으로 코딩했다. 1. 영상 읽기 및 띄우기2. 선명화 된 영상 저장할 공간 마련 - create 메소드3. 선명화 연산 - sharpen 함수4. 선명화된 영상 띄우기 아래 코드를 한번 복붙해서 실행한 후에 코드에 대해 이해해가는 것을 추천한다. #incl..

코딩/C, C++ 2018.03.07

[opencv와 C++로 컴퓨터 비전] 영상 내 컬러 개수 감소

▶ 영상 내 컬러 개수 감소시키기 컬러 영상의 경우 각 픽셀당 세개의 색으로 표현된다. R, G, B 모두 256개의 값을 가지고 있으므로 총 256 * 256 * 256 = 16,777,216개의 색을 표현할 수 있다. 1600만개가 넘는 수다. 때로는 분석 복잡도를 줄이기 위해서 컬러 개수를 감소시키는 것이 좋다. 컬러를 감소시키는 방법에는 여러가지가 있을 수 있지만 가장 직관적이면서도 간단한 방법을 공부해보려고 한다. R, G, B 각 차원당 256개(0~255)인 것을 128개, 64개, 32개, 16개 등으로 줄이기 위한 가장 간단한 방법은 비슷한 밝기세기들을 하나로 취급하는 것이다. 예를 들어 32개로 줄인다고 하면, 0~7에 해당하는 세기는 전부 다 중간세기값에 해당하는 4로, 8~15는 1..

코딩/C, C++ 2018.02.15

제가 심심풀이로 만든 저격수 훈련 게임: '아임스나이퍼' (은근 중독성 있음)

C++ 및 opencv 공부겸 저격 게임을 만들어봤습니다.ㅋㅋ 게임 방법은 아주 간단합니다. 마우스 좌클릭만 할 줄 알면 됩니다. 원이 일정 시간 간격으로 화면에 나타나는데 원의 중심을 클릭하시면 됩니다. 원의 중심에 가까울수록 좋은 점수를 받을 수 있고, 원의 중심을 정확하게 클릭한 경우에는 보너스 점수를 받게 됩니다. 일정 점수를 넘게 되면 다음 라운드로 진출하게 되고 점점 원의 크기도 커지고, 원이 나타나는 시간 간격도 짧아집니다. 많은 원을 없애지 못한 경우에 다음 라운드로 넘어가지 못하고 게임이 종료되니 빠르고 정확히 원들을 없애는 것에 목표를 두시면 됩니다. 게임 파일은 아래 링크에 있으니 다운받으신 후에 압축푸시고, ImSniper.exe 실행하시면 됩니다. 티스토리는 파일 업로드가 10메가..

코딩/C, C++ 2018.02.06 (18)

[opencv와 C++로 컴퓨터 비전] 예쁜 타이머 만들기 (타이머 종료시 음악 재생)

▶ 타이머 만들기 시간을 세팅하면 그 시간 후에 종료하는 타이머를 만들어보자. 예를 들어 30초를 세팅하면 29, 28, 27, 26,...이 검은 화면에 뜨다가 0이 되면 노래가 재생하도록 만들어보자. 좀 더 예쁘게 만들기 위해서 숫자의 색깔이 계속 랜덤해서 바뀌게 할 것이다. 아래와 같은 절차를 밟을 것이다. 1. 몇 시간, 몇 분, 몇 초 뒤에 알람이 울릴지 입력한다.2. 입력된 시간을 초로 변환한다. 3. 검정 화면에 남은 초가 출력된다. 4. 시간이 종료 되면 음악이 재생된다.5. 사용자가 0을 타이핑하면 음악이 중지되며 타이머 프로그램이 종료된다. 코드는 아래와 같다. 주석을 잘 참고하자. 아래에서 중요한 부분들은 좀 더 자세히 다룰 것이다. #include #include #include #..

코딩/C, C++ 2018.02.02 (6)

[opencv와 C++로 컴퓨터 비전] 영상에 소금-후추 잡음(salt-and-pepper noise) 넣기

▶ 영상에 소금-후추 잡음 첨가 오늘은 영상에 소금-후추 잡음을 넣어보려고 한다. 1. 영상 읽기2. 소금-후추 잡음 넣을 픽셀 랜덤하게 선택3. 잡음의 형태가 소금 또는 후추인지 랜덤하게 선택4. 선택된 픽셀에 접근해서 소금 또는 후추 넣기5. 소금-후추 잡음 첨가된 영상 전시 코드는 아래와 같다. 주석을 잘 살펴보자. #include #include #include #include // srand 함수 사용을 위해서#include // time 함수 사용을 위해서 void salt_pepper(cv::Mat image, int n) // 소금-후추 잡음 첨가 함수{int i, j; srand((int)time(NULL)); for (int k = 0; k < n; k++) {i = rand() % i..

코딩/C, C++ 2018.02.01 (2)

[opencv와 C++로 컴퓨터 비전] 영상 위에 로고 넣기

▶ 영상에 로고 넣기 오늘은 영상에 로고 넣기를 해볼 것이다. 영상을 넣어줄 이미지와 로고는 각각 다음과 같다. 참고로 사진의 주인공은 천진대학교에 방문한 아빠..ㅎㅎ 로고는 천진대학교 로고이다. 코드는 아래와 같은 내용으로 구성되어 있다. 1. 로고를 넣을 영상 읽기2. 로고 영상 읽기3. 로고 영상 그레이 레벨로 읽기4. 로고를 넣을 영상 및 로고 영상 사이즈 콘솔에 출력5. 로고를 넣어줄 위치, 즉 관심영역(ROI) 설정 6. 로고 흑백 영상을 마스크로 사용해서 로고를 ROI에 삽입 코드는 아래와 같다. 주석을 참고하자. #include #include #include int main(){cv::Mat father = cv::imread("father.jpg"); // 로고를 넣어줄 영상 읽기cv:..

코딩/C, C++ 2018.01.31

[opencv와 C++로 컴퓨터 비전] 영상 위에 그림 그리기 및 글쓰기

▶ 영상 위에 그림 그리고 글쓰기 영상을 불러와서 그 위에 사각형을 그리고, 글씨를 적어보려고 한다. 아래와 같은 절차를 밟을 것이다. 1. 영상 읽기2. 영상 띄우기3. 영상 위에 사각형 그리기- cv::rectangle4. 영상 위에 글쓰기- cv::putText 코드는 아래와 같다. 코드에 주석을 달아놓았으니 참고하자. #include #include #include // rectangle과 putText 함수 사용을 위해#include int main(){cv::Mat image;image = cv::imread("cutlet.JPG"); cv::imshow("pork cutlet", image); cv::rectangle(image, cv::Point(20, 60), cv::Point(400, ..

코딩/C, C++ 2018.01.30

[opencv와 C++로 컴퓨터 비전] 마우스로 영상 위에서 클릭한 위치와 화소 값 출력하기

▶ 마우스를 클릭할 때마다 대응하는 화소 값 출력하기 아래는 마우스로 창으로 띄운 이미지에 어떤 부분을 좌클릭했을 때 위치와 화소값을 알려 주는 예제이다. 우클릭할 때는 단순히 Hello!가 콘솔에 출력되게 했다. #include #include #include void onMouse(int event, int x, int y, int flags, void* param); int main(){cv::Mat image;image = cv::imread("jecheon.jpg", CV_LOAD_IMAGE_GRAYSCALE); // 그레이 스케일로 영상 읽기 cv::imshow("Jecheon", image); //Jecheon이라는 창에 이미지 출력 cv::setMouseCallback("Jecheon", ..

코딩/C, C++ 2018.01.29