▶ 본문


사도행전 13:44-52

44 그 다음 안식일에는 온 시민이 거의 다 하나님의 말씀을 듣고자 하여 모이니

45 유대인들이 그 무리를 보고 시기가 가득하여 바울이 말한 것을 반박하고 비방하거늘

46 바울과 바나바가 담대히 말하여 이르되 하나님의 말씀을 마땅히 먼저 너희에게 전할 것이로되 너희가 그것을 버리고 영생을 얻기에 합당하지 않은 자로 자처하기로 우리가 이방인에게로 향하노라

47 주께서 이같이 우리에게 명하시되 내가 너를 이방의 빛으로 삼아 너로 땅 끝까지 구원하게 하리라 하셨느니라 하니

48 이방인들이 듣고 기뻐하여 하나님의 말씀을 찬송하며 영생을 두시기로 작정된 자는 다 믿더라

49 주의 말씀이 그 지방에 두루 퍼지니라

50 이에 유대인들이 경건한 귀부인들과 그 시내 유력자들을 선동하여 바울과 바나바를 박해하게 하여 그 지역에서 쫓아내니

51 두 사람이 그들을 향하여 발의 티끌을 떨어 버리고 이고니온으로 가거늘

52 제자들은 기쁨과 성령이 충만하니라



묵상 


수많은 유대인들은 자신에게 선물로 주어진 복음을 버렸다. 그러나 많은 이방인들은 그 복음을 기쁘게 받아들이고 구원을 받았다. 


복음, 복된 소식, 기쁜 소식을 기쁘게 받아들이는 사람은 구원을 받고, 복음을 거부하는 사람은 구원받지 못한다는 이 단순한 사실. 


복음은 무인도에 표류한 사람에게 보내진 구조헬기와 같다. 헬기의 기장이 어서 올라 타라고 방송을 하며 기다리고 있다. 집으로 데려다 주겠다고. 그런데 많은 사람들이 타기를 주저한다. 자신에게 처해진 비참한 상황을 잘 모르는 것 같다. 아니면 인정하고 싶지 않은 것 같다. 마음씨 좋은 기장이 오랫동안 기다려주지만 언제 출발할지 모른다. 그 전에 타지 않으면 사랑하는 가족들과 친구들이 있는 고향에 못 돌아가고 굶어죽는 것이다. 


하나님 감사해요! 저에게 복음을 주시고, 그것을 받아들이게 하셔서 감사합니다! 

Posted by 톈진난만

댓글을 달아 주세요

▶ 본문


사도행전 13:32-43

32 우리도 조상들에게 주신 약속을 너희에게 전파하노니

33 곧 하나님이 예수를 일으키사 우리 자녀들에게 이 약속을 이루게 하셨다 함이라 시편 둘째 편에 기록된 바와 같이 너는 내 아들이라 오늘 너를 낳았다 하셨고

34 또 하나님께서 죽은 자 가운데서 그를 일으키사 다시 썩음을 당하지 않게 하실 것을 가르쳐 이르시되 내가 다윗의 거룩하고 미쁜 은사를 너희에게 주리라 하셨으며

35 또 다른 시편에 일렀으되 주의 거룩한 자로 썩음을 당하지 않게 하시리라 하셨느니라

36 다윗은 당시에 하나님의 뜻을 따라 섬기다가 잠들어 그 조상들과 함께 묻혀 썩음을 당하였으되

37 하나님께서 살리신 이는 썩음을 당하지 아니하였나니

38 그러므로 형제들아 너희가 알 것은 이 사람을 힘입어 죄 사함을 너희에게 전하는 이것이며

39 또 모세의 율법으로 너희가 의롭다 하심을 얻지 못하던 모든 일에도 이 사람을 힘입어 믿는 자마다 의롭다 하심을 얻는 이것이라

40 그런즉 너희는 선지자들을 통하여 말씀하신 것이 너희에게 미칠까 삼가라

41 일렀으되 보라 멸시하는 사람들아 너희는 놀라고 멸망하라 내가 너희 때를 당하여 한 일을 행할 것이니 사람이 너희에게 일러줄지라도 도무지 믿지 못할 일이라 하였느니라 하니라

42 그들이 나갈새 사람들이 청하되 다음 안식일에도 이 말씀을 하라 하더라

43 회당의 모임이 흩어진 후에 유대인과 유대교에 입교한 경건한 사람들이 많이 바울과 바나바를 따르니 두 사도가 더불어 말하고 항상 하나님의 은혜 가운데 있으라 권하니라



묵상


예수님 덕분에 죄 사함을 받았고, 예수님 덕분에 의롭다 함을 얻었다. 게으르고 음란하고 무정한 죄인인 내가. 


우리가 구원받을 수 있는 방법은 오직 예수님을 믿는 것 뿐이다. 다른 대안은 없다. 수천 조의 돈이 있어도 구원 받을 수 없다. 평생 봉사활동만 하고 살았어도 구원 받을 수 없다. 유명해서 많은 사람들에게 영향력을 행사한다고 해도 구원 받을 수 없다. 건강해서 120세까지 살아도 구원 받을 수 없다. 베스트셀러의 작가라고 해도 구원 받을 수 없다. 노벨상을 받아도 구원 받을 수 없다. 한 국가의 지도자가 되어도 구원 받을 수 없다. 평생 남부끄럽지 않게 열심히 살았어도 구원 받을 수 없다. 단 한가지 조건, 예수님을 믿지 않는다면 말이다. 



찬양 <예수 피를 힘입어>

주의 보좌로 나아갈 때에 어떻게 나가야할까 

나를 구원한 주의 십자가 그것을 믿으며 가네


주의 보좌로 나아갈 때에 나 여전히 부족하나

나를 품으신 주의 그 사랑 그것을 믿으며 가네


자격없는 내 힘이 아닌 오직 예수님의 보혈로

자격없는 내 힘이 아닌 오직 예수님의 보혈로


십자가의 보혈 완전하신 사랑 힘입어 나아갑니다

십자가의 보혈 완전하신 사랑 힘입어 예배합니다


 

찬양 <오직 예수>

오직 예수 다른 이름은 없네 

주 이름만 우리에게 주셨네

오직 예수 다른 이름 없네 

오 영광과 존귀 권세와 찬양

받으실 분 오직 주 예수


온 땅 위에 홀로 높으신 이름 

하늘 위 높이 들리셨네

온 땅 위에 홀로 높으신 이름 

영광과 존귀와 찬양 드리세



여러분 예수님 믿으세요. 축복합니다 :D

Posted by 톈진난만

댓글을 달아 주세요

▶ 타이머 만들기


시간을 세팅하면 그 시간 후에 종료하는 타이머를 만들어보자. 예를 들어 30초를 세팅하면 29, 28, 27, 26,...이 검은 화면에 뜨다가 0이 되면 노래가 재생하도록 만들어보자. 좀 더 예쁘게 만들기 위해서 숫자의 색깔이 계속 랜덤해서 바뀌게 할 것이다. 아래와 같은 절차를 밟을 것이다. 


1. 몇 시간, 몇 분, 몇 초 뒤에 알람이 울릴지 입력한다.

2. 입력된 시간을 초로 변환한다. 

3. 검정 화면에 남은 초가 출력된다. 

4. 시간이 종료 되면 음악이 재생된다.

5. 사용자가 0을 타이핑하면 음악이 중지되며 타이머 프로그램이 종료된다. 


코드는 아래와 같다. 주석을 잘 참고하자. 아래에서 중요한 부분들은 좀 더 자세히 다룰 것이다. 


#include <iostream>

#include <opencv2/core.hpp>

#include <opencv2/highgui.hpp>

#include <opencv2/imgproc.hpp> // cv::putText() 사용을 위해


#include <stdlib.h> // srand() 사용을 위해

#include <time.h> // time() 사용을 위해



#include <Windows.h> // PlaySound() 사용을 위해

#include <mmsystem.h> // PlaySound() 사용을 위해


#pragma comment(lib, "winmm.lib") // 


#define SOUND_NAME "Man-Of-Sorrows_-Acoustic.wav" // 재생할 노래 이름



int main()

{

int h, m, s;

int total_s;


srand((int)time(NULL)); //현재 시간을 이용해서 씨드 설정 


std::cout << "[ ] hours, [ ] minutes, [ ] seconds" << std::endl;

std::cout << "ex) 0 hours, 1 minutes, 0 seconds. Type >> 0 1 0" << std::endl;

std::cout << "ex) 0 hours, 0 minutes, 30 seconds. Type >> 0 0 30\n" << std::endl;


std::cin >> h >> m >> s;


total_s = h * 3600 + m * 60 + s;

std::cout << "Timer is set: " << total_s << " sec" << std::endl;


for (int i = 1; i <= total_s; i++)

{

cv::Mat bg(100, 400, CV_8UC3, cv::Scalar(0.0, 0.0, 0.0)); // 타이머 검정 배경 화면

char buf[100];

sprintf_s(buf, "%d", total_s - i); // int형 정수를 char형 문자열로 전환, total_s - i 는 남은 초를 의미. 


cv::putText(bg, buf, cv::Point(40, 70), cv::FONT_HERSHEY_PLAIN, 5.0, cv::Scalar(rand() % 255 + 1.0, rand() % 255 + 1.0, rand() % 255 + 1.0), 5); // 검정 화면에 초를 띄운다. 숫자의 색이 랜덤하게 변하게 설정. 

cv::imshow("Timer", bg);

cv::waitKey(1000);

}


PlaySound(TEXT(SOUND_NAME), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); // 노래 재생, 재생하면서 아래 코드 계속 진행. 노래는 반복 재생되게 설정. 


int opt = 1;

do

{

std::cout << "\nDo you want to turn off the music?" << std::endl;

std::cout << "Type >> 0\n" << std::endl;

std::cin >> opt;

} while (opt != 0); // 0이 입력되지 않았다면 계속 반복문 실행


PlaySound(NULL, 0, 0); // 재생중이던 음악 중지


std::cout << "\nTimer is finished!\a" << std::endl; // 종료 문구와 함께 경고음

 

    return 0;

}


타이머를 실행한 결과는 영상으로 녹화를 해보았다. 시간이 종료되고 음악이 재생될 때 0을 입력해야 음악이 종료되는데 일부러 먼저 1을 입력해서 0외의 다른 키를 입력할 때는 종료되지 않음을 보였다. 




▶ 좀 더 알고 넘어갈 것들


1) 남는 시간 화면에 출력하기


타이머를 예쁘기 만들기 위해서 나는 opencv를 활용해서 남은 초를 이미지 창을 하나 열어 이미지로 나타냈다. 먼저 검정색 이미지를 만든 다음에 거기에 남은 초가 보여지게 만들었다. 그리고 for문 안에 cv::waitKey(1000)을 이용해서 1초마다 남은 초가 갱신되게 했다. 


cv::waitKey(1000);


cv::waitKey()의 입력 인자가 0보다 큰 양수일 때는 ms단위만큼 이미지를 보여준다는 의미이다. 따라서 1000이면 1초, 2000이면 2초가 된다.



2) 숫자를 문자열로 변환


남은 초를 이미지창에 텍스트로 삽입하기 위해서 cv::putText()를 사용했다. 남은 초는 정수이기 때문에 이 함수를 활용하기 위해서는 문자열로 변형해줄 필요가 있다. 이 부분은 구글링 중에 [2]를 참고해서 구현했다. 


char buf[100];

sprintf_s(buf, "%d", total_s - i);


먼저 문자열을 저장해줄 공간을 준비한 다음에 sprintf_s()를 활용하여 정수를 문자열로 변환했다. 2번째 줄 코드를 해석하면 buf라는 이름의 배열에 int형 정수인 total_s - i (남은 초)를 문자열로 변환해서 저장하라는 것이다. 



3) 음악 재생 관련


타이머가 종료되는 것을 알려주기 위해 노래를 재생시켰다. PlaySound() 함수를 사용했는데, 이를 사용하기 위해서는 먼저 헤더부분에 아래와 같은 코드들이 필요하다. 


#include <Windows.h> 

#include <mmsystem.h> 


#pragma comment(lib, "winmm.lib") 

#define SOUND_NAME "Man-Of-Sorrows_-Acoustic.wav" 


Windows.h와 mmsystem.h는 PlaySound()를 사용하기 위해 필요한 헤더 파일들이다. 그리고 #pragma 매크로는 lib파일을 불러들이는데 필요하다고 한다. 그리고 네번째 줄에서 Man-Of-sorrows_-Acoustic.wav는 재생할 음악의 파일명이다. PlaySound() 함수로는 wav 파일만 재생이 가능하다. 


그리고 노래를 재생하고 싶은 부분에 아래와 같은 코드를 넣어줘야 한다. 


PlaySound(TEXT(SOUND_NAME), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);


여기서 중요한 것은 SND_ASYNC와 SND_LOOP인데, SND_ASYNC는 음악을 재생하면서 다음 코드를 실행한다는 의미이고, SND_LOOP는 음악를 계속해서 반복재생하라는 것이다. 노래를 재생 중간에 끄고 싶으면 다음과 같은 코드가 필요하다. 


PlaySound(NULL, 0, 0);



▶ 정리


내용 중 이해가 안되는 부분이 있다면 말씀해주시면 좀 더 자세히 설명해드리겠습니다! 또한 잘못된 것 있다면 친절히 알려주세요~ㅎㅎ



<참고자료>

[1] https://convertio.co/kr/mp3-converter/ => .mp3 파일로 변환 또는 .mp3 파일을 다른 형식으로 변환해주는 사이트. 본 프로그램을 위해 mp3 파일을 wmv 파일로 변환했음. 

[2] https://blog.naver.com/djtjf12/220625803727 => PlaySound 함수 사용법 참고

Posted by 톈진난만

댓글을 달아 주세요

▶ 본문


사도행전 13:13-31

13 바울과 및 동행하는 사람들이 바보에서 배 타고 밤빌리아에 있는 버가에 이르니 요한은 그들에게서 떠나 예루살렘으로 돌아가고

14 그들은 버가에서 더 나아가 비시디아 안디옥에 이르러 안식일에 회당에 들어가 앉으니라

15 율법과 선지자의 글을 읽은 후에 회당장들이 사람을 보내어 물어 이르되 형제들아 만일 백성을 권할 말이 있거든 말하라 하니

16 바울이 일어나 손짓하며 말하되 이스라엘 사람들과 및 하나님을 경외하는 사람들아 들으라

17 이 이스라엘 백성의 하나님이 우리 조상들을 택하시고 애굽 땅에서 나그네 된 그 백성을 높여 큰 권능으로 인도하여 내사

18 광야에서 약 사십 년간 그들의 소행을 참으시고

19 가나안 땅 일곱 족속을 멸하사 그 땅을 기업으로 주시기까지 약 사백오십 년간이라

20 그 후에 선지자 사무엘 때까지 사사를 주셨더니

21 그 후에 그들이 왕을 구하거늘 하나님이 베냐민 지파 사람 기스의 아들 사울을 사십 년간 주셨다가

22 폐하시고 다윗을 왕으로 세우시고 증언하여 이르시되 내가 이새의 아들 다윗을 만나니 내 마음에 맞는 사람이라 내 뜻을 다 이루리라 하시더니

23 하나님이 약속하신 대로 이 사람의 후손에서 이스라엘을 위하여 구주를 세우셨으니 곧 예수라

24 그가 오시기에 앞서 요한이 먼저 회개의 세례를 이스라엘 모든 백성에게 전파하니라

25 요한이 그 달려갈 길을 마칠 때에 말하되 너희가 나를 누구로 생각하느냐 나는 그리스도가 아니라 내 뒤에 오시는 이가 있으니 나는 그 발의 신발끈을 풀기도 감당하지 못하리라 하였으니

26 형제들아 아브라함의 후손과 너희 중 하나님을 경외하는 사람들아 이 구원의 말씀을 우리에게 보내셨거늘

27 예루살렘에 사는 자들과 그들 관리들이 예수와 및 안식일마다 외우는 바 선지자들의 말을 알지 못하므로 예수를 정죄하여 선지자들의 말을 응하게 하였도다

28 죽일 죄를 하나도 찾지 못하였으나 빌라도에게 죽여 달라 하였으니

29 성경에 그를 가리켜 기록한 말씀을 다 응하게 한 것이라 후에 나무에서 내려다가 무덤에 두었으나

30 하나님이 죽은 자 가운데서 그를 살리신지라

31 갈릴리로부터 예루살렘에 함께 올라간 사람들에게 여러 날 보이셨으니 그들이 이 백성 앞에서 그의 증인이라



▶ 묵상


바울이 설교에서 언급하고 있는 사건은 아래와 같다. 


1) 아브라함-이삭-야곱-요셉으로 이어지는 족장 시대 

2) 출애굽 사건

3) 광야 생활

4) 가나안 점령

5) 사사 시대

6) 사울-다윗-다윗의 후손들으로 이어지는 왕정시대

7) 요한의 세례

8) 예수님의 초림, 죽으심, 부활


바울은 한마디로 회당에 모인 사람들에게 구약개관 설교를 했다. 예수님이 이 땅에 오신 사건은 아브라함때부터 약속되어 온 것임을 알려주고 싶었던 것같다. "여러분 드디어 그 약속이 이뤄졌습니다. 얼마 전에 예루살렘에서! 예수님이 바로 우리가 기다리던 메시야이십니다!" 바울의 설교를 들은 사람 중에 진심으로 하나님이 약속하신 것을 믿고 기다렸던 사람은 예수님이 그분이시라는 것을 깨달았을 것이다. 성경을 제대로 읽어왔다면 예수님이 메시야라는 것을 인정할 수 있었을 것이다. 반면 단지 하나의 종교에 불과했던 사람들은 들어도 몰랐을 것이다. 

Posted by 톈진난만

댓글을 달아 주세요

▶ 영상에 소금-후추 잡음 첨가


오늘은 영상에 소금-후추 잡음을 넣어보려고 한다. 


1. 영상 읽기

2. 소금-후추 잡음 넣을 픽셀 랜덤하게 선택

3. 잡음의 형태가 소금 또는 후추인지 랜덤하게 선택

4. 선택된 픽셀에 접근해서 소금 또는 후추 넣기

5. 소금-후추 잡음 첨가된 영상 전시


코드는 아래와 같다. 주석을 잘 살펴보자. 


#include <iostream>

#include <opencv2/core.hpp>

#include <opencv2/highgui.hpp>

#include <stdlib.h> // srand 함수 사용을 위해서

#include <time.h> // 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() % image.cols; // 이미지의 열크기 내에서 랜덤 수 생성, x 좌표값

j = rand() % image.rows; // 이미지의 행크기 내에서 랜덤 수 생성, y 좌표값

std::cout <<"at (" << j << ", " << i << "), add salt or pepper!" << std::endl; // 랜덤하게 결정된 픽셀 위치 출력, (x, y)


int salt_or_pepper = (rand() % 2) * 255; // 랜덤하게 0 또는 255, 0이면 후추, 255면 소금


if (image.type() == CV_8UC1) // 그레이레벨 영상이라면

{

image.at<uchar>(j, i) = salt_or_pepper; // 랜덤하게 선택된 픽셀에 0 또는 255을 대입 

}

else if (image.type() == CV_8UC3) // 3채널 컬러 영상이라면

{

        // 랜덤하게 선택된 픽셀에 0 또는 255을 대입, 흰색 또는 검정색을 만들기 위해 세 컬러 채널에 동일한 것이 들어감. (0, 0, 0) 또는 (255, 255, 255). 

                        image.at<cv::Vec3b>(j, i)[0] = salt_or_pepper; // B 채널

image.at<cv::Vec3b>(j, i)[1] = salt_or_pepper; // G 채널

image.at<cv::Vec3b>(j, i)[2] = salt_or_pepper; // R 채널

}

}

}


int main() // 메인 함수

{

cv::Mat img = cv::imread("huoguo.jpg"); // 이미지 읽기


cv::imshow("before", img); // 원본 이미지 전시

cv::waitKey(0);


salt_pepper(img, 5000);  //img에 5000알의 소금 또는 후추를 뿌려라!

cv::imshow("after", img); // 결과 이미지 전시


cv::waitKey(0);


    return 0;

}


소금-후추 잡음 첨가 전후 이미지를 살펴보자. 까맣고 하얀 점들이 영상 곳곳에 뿌려진 것을 확인할 수 있다. 




그리고 콘솔에는 소금-후추 잡음이 첨가된 픽셀의 위치값들이 출력되었다. 




▶ 좀 더 알고 넘어갈 것들


1) 랜덤 수(난수) 생성 관련


랜덤하게 소금-후추를 뿌릴 픽셀을 선정하기 위해서 랜덤 수를 생성하는 코드를 작성해줘야 한다. 나는 C언어를 공부할 때의 기억을 되살려서 랜덤 수를 생성했다.  


#include <stdlib.h> 

#include <time.h>


일단 이 두개의 해더파일을 포함시켜줘야 한다. stdlib.h는 srand() 함수를 호출해주기 위해서 필요하고, time.h는 time() 함수 때문에 필요하다. 그리고 랜덤 수를 생성하기 전에 한 줄의 코드가 더 필요하다. 


srand((int)time(NULL));


여기 안에는 두 개의 함수가 사용되고 있다. 일단 srand()는 하나의 인자를 전달받는데, 이 인자를 씨드값이라고 한다. 이 씨드값에 따라 rand() 함수 호출 시 생성되는 난수들이 달라진다. 지금 여기서는 씨드값으로 (int)time(NULL)를 넣어주고 있는데, time() 함수는 현재 컴퓨터의 시간과 1970년 1월 1일과의 시간 차이를 초 단위로 계산해서 반환해 준다. 컴퓨터의 시간은 시간이 흐를수록 계속 변하므로 1970년 1월 1일과의 차이도 계속 변한다. 이 말은 곧 씨드값이 계속해서 변한다는 것이다. 결과적으로 우리는 진정한 난수를 얻게 된다. 이제 난수를 얻기 위해서 아래와 같은 간단한 명령어만 필요하다. 


rand()



2) 나머지 연산자 %


랜덤하게 픽셀 위치를 얻기 위해 rand()와 나머지 연산자를 활용했다. 


i = rand() % image.cols;

j = rand() % image.rows;


rand() 함수로 생성된 난수를 이미지의 가로 길이로 나눈 나머지 값을 x 좌표값으로 설정해주었다. 이미지의 가로 길이가 여기서는 800이므로 어떤 난수가 생성되었든 800으로 나눠주면 나머지는 0~799 중에 하나가 될 것이다. 마찬가지로 y좌표값은 rand()함수로 생성된 난수를 이미지의 세로 길이로 나눈 나머지 값으로 설정해주었다. 여기서는 세로 길이가 530이므로 0~529의 값 중 하나가 y좌표값으로 선정된다. 결과적으로 이미지 내에 있는 픽셀 중에 하나가 랜덤하게 선택된다. 이곳에 소금-후추 잡음을 첨가해주었다. 


소금인지 후추인지 결정할 때도 rand()와 나머지 연산자를 활용했다. 방식은 동일하다. 단 이번에는 0과 255 둘 중 하나만 랜덤하게 선택해줘야 한다. 따라서 이번에는 rand()로 얻은 난수를 2로 나눠서 나머지가 0 또는 1이 되게 한 다음에 255를 곱해주었다. 나머지가 0이면 그대로 0이 될 것이고, 1이면 255가 될 것이다. 



3) type 메소드


type 메소드로 입력된 영상이 그레이 레벨인지 컬러인지 확인한다. 위에서 입력해준 영상은 컬러였기 때문에 image.type() == CV_8UC3이 true가 되어서 else if 내의 명령들을 실행했다. 



4) 영상 원소 접근 관련


영상 원소에 접근할 때는 at 메소드를 사용할 수 있다. image라는 이름을 갖고 있는 그레이레벨 영상의 100번째 행, 200번째 열에 존재하는 픽셀의 화소값을 255, 즉 흰색으로 대입하는 경우는 아래와 같이 코딩한다. 


image.at<uchar>(100, 200) = 255;


보다시피 at 메소드를 호출할 때는 영상의 원소 타입을 지정해야 한다. 그레이레벨 영상이므로 uchar, 즉 unsigned character이다. 부호없는 8비트 값이다. 


컬러 영상의 경우에는 세개의 채널에 각각 화소값들을 모두 넣어줘야 한다. 예를 들어 300번째 행, 100번째 열에 존재하는 픽셀을 완전한 파란색으로 만들어주고 싶다면 B채널에 255, G채널과 R채널에는 0을 대입해주면 된다. 컬러 영상은 cv::Vec3b, 즉 uchar 타입의 벡터로 원소 타입을 지정해준다. 세 개의 부호 없는 8비트의 벡터라는 뜻이다. 


image.at<cv::Vec3b>(300, 100)[0] = 255;

image.at<cv::Vec3b>(300, 100)[1] = 0;

image.at<cv::Vec3b>(300, 100)[2] = 0;


이것을 아래와 같이 한줄로 표현할 수도 있다. 동일한 결과를 산출해낸다. 


image.at<cv::Vec3b>(300, 100) = cv::Vec3b(255, 0, 0);




<참고자료>

[1] 로버트 라가니에 지음, 이문호 옮김, "OpenCV를 활용한 컴퓨터 비전 프로그래밍 3/e", 에이콘

[2] 윤성우, "C 프로그래밍", 프리렉

Posted by 톈진난만

댓글을 달아 주세요

  1. 이런글엔 댓글을 달아야죠 2018.05.03 01:11 신고  댓글주소  수정/삭제  댓글쓰기

    도움이 됐습니다. 공부하고 갑니다.

▶ 본문


사도행전 13:1-12

1 안디옥 교회에 선지자들과 교사들이 있으니 곧 바나바와 니게르라 하는 시므온과 구레네 사람 루기오와 분봉 왕 헤롯의 젖동생 마나엔과 및 사울이라

2 주를 섬겨 금식할 때에 성령이 이르시되 내가 불러 시키는 일을 위하여 바나바와 사울을 따로 세우라 하시니

3 이에 금식하며 기도하고 두 사람에게 안수하여 보내니라

4 두 사람이 성령의 보내심을 받아 실루기아에 내려가서 거기서 배를 타고 구브로에 가서

5 살라미에 이르러 하나님의 말씀을 유대인의 여러 회당에서 전할새 요한을 수행원으로 두었더라

6 온 섬 가운데로 지나서 바보에 이르러 바예수라 하는 유대인 거짓 선지자인 마술사를 만나니

7 그가 총독 서기오 바울과 함께 있으니 서기오 바울은 지혜 있는 사람이라 바나바와 사울을 불러 하나님의 말씀을 듣고자 하더라

8 이 마술사 엘루마는 (이 이름을 번역하면 마술사라) 그들을 대적하여 총독으로 믿지 못하게 힘쓰니

9 바울이라고 하는 사울이 성령이 충만하여 그를 주목하고

10 이르되 모든 거짓과 악행이 가득한 자요 마귀의 자식이요 모든 의의 원수여 주의 바른 길을 굽게 하기를 그치지 아니하겠느냐

11 보라 이제 주의 손이 네 위에 있으니 네가 맹인이 되어 얼마 동안 해를 보지 못하리라 하니 즉시 안개와 어둠이 그를 덮어 인도할 사람을 두루 구하는지라

12 이에 총독이 그렇게 된 것을 보고 믿으며 주의 가르치심을 놀랍게 여기니라



▶ 묵상


본문을 읽다보니 엘루마의 모습과 리처드 도킨스의 모습이 오버랩 된다. 최근에 대표적인 무신론자 리처드 도킨스가 쓴 <만들어진 신>을 1/3 정도 읽었다. 어떤 논리로 하나님의 부재함을 증명하려고 하는지 알고 싶었다. 기독교 신앙의 반대편에 있는 사람들이 어떤 생각을 가지고 있는지 좀 더 알고 싶었다. 


책을 읽으면서 느낀 것은 신이 존재하지 않는다를 결론에 두고 거기에 맞는 증거들을 짜집기해서 정리해놓은 듯한 느낌이 많이 들었다. (과학계의 수많은 논문들이 그렇듯이... 참 슬픈 현실이다.) 거기에 노벨상 수상자들의 추천사, 리뷰를 표지에 넣어 사람들로하여금 더 신뢰를 주려했다. 


책을 읽으면서 신이 존재하지 않는다는 편견으로 세상을 보면 이렇게까지 생각할 수 있구나 싶었다. 물론 나같은 기독교인들도 하나님이 계신다는 편견으로 세상을 본다고 말할 수 있다. 양측 모두 편견이 있는 것이다. 그러나 무신론자들은 창조론은 성경에 나오니 비과학적이라고 말하고, 자신들이 주장하는 진화론은 과학적이라고 말한다. 하지만 진화론이 정말로 증명된 것이냐 하면 그렇지가 않다. 종에서 다른 종이 생성되는 진화가 실제로 존재한다면, 그 중간 단계의 화석들이 있어야한다. 그것도 무수히 많이 존재해야 한다. 하지만 엄청난 노력에도 불구하고 그러한 화석은 발견되지 않고 있다. 진화론은 하나님의 존재를 인정하고 싶지 않은 사람들에게 유일한 대안이기 때문에 꼭 붙잡고 있는 것이다. 진화론의 오류를 나타내는 연구결과가 나와도 그들은 결코 받아들이지 않는다. 진화론 역시 하나의 믿음이다. 


하나님을 못 믿게 만드려고 노력하는 사람들은 정말로 불쌍한 존재들이다. 그냥 책을 읽으면서 그런 생각이 많이 들었다. '왜 리처드 도킨스는 이런 책을 써서 사람들을 혼란스럽게 만들고, 하나님을 믿지 못하게 만들까?' 처음에는 너무 화가 났다. '내가 믿고 사랑하는 하나님을 이렇게 왜곡시키다니...' 그런데 그 분노는 점차 긍휼로 바뀌었다. '나중에 진실을 알게 되면 얼마나 후회할까...' 부디 이 사람이 살아있을 때 진리를 알고 하나님의 용서하심을 받았으면 좋겠다. 또한 하나님을 대적하는 일을 속히 멈추기를.. 본문의 마술사 엘루마와 같이 하나님께 혼쭐나기 전에. 

Posted by 톈진난만

댓글을 달아 주세요

가산명사인지 불가산명사인지 자주 헷갈리는 것들을 모아놓았다.



▶ 가산명사


song 

ex) Kate was singing a song.


battery 

ex) There are no batteries in the radio. 


accident 

ex) It wasn't your fault. It was an accident. 


restaurant 

ex) We went to a very nice restaurant last weekend.

problem 

ex) I wonder if you can help me. I have a problem. 

idea

ex) I like your suggestion. It's a very interesting idea.


interview 

ex) John has an interview for a job tomorrow.


job (work은 불가산 명사)

ex) John has an interview for a job tomorrow.


necklace 목걸이 (어떤 장신구인지 구체적인 경우에는 가산명사인 듯) 

ex) Jane was wearing beautiful necklace. 


decision 

ex) We can't delay much longer. We have to make a decision soon. 


language 

ex) Do you speak any foreign languages? 


headache

ex) I've got a headache. 




▶ 불가산명사


music 

ex) Kate was listening to music. 


electricity 

ex) There is no electricity in this house. 


luck 

ex) It wasn't your fault. It was bad luck. 


jewelry 장신구 

ex) Liz doesn't usually wear jewelry. 


volleyball 배구 (스포츠 종목 이름은 일반적으로 불가산 명사인 듯) 

ex) I like volleyball. 


advice (suggestion은 가산명사)

ex) That's good advice. 

ex) That's a good suggestion. 


baggage(미국식), luggage(영국식) 수하물

ex) We had a lot of baggage. 

ex) Do you have a lot of luggage? 


behavior

ex) His words and behavior weigh heavily with me. 


bread 

ex) I'm going to buy some bread. (be going to는 미리 어떤 것을 하기로 결심한 것을 말할 때 사용한다.)


chaos 혼돈, 혼란

ex) Without rules, people would live in a state of chaos. 


damage 

ex) Eggs are helpful for people who have nerve damage. 


furniture

ex) Where are you going to put all your furniture?


information

ex) Let me know if you need more information. 


news 복수형이 아님. 이 자체로 불가산명사임.

ex) The news was very depressing. 


permission 허락, 허가

ex) You must ask permission for all major expenditure. 


progress 진전, 진척

ex) No appreciable progress has been made in the work. 


scenery 경치, 풍경 (view는 가산 명사)

ex) Scenery changes from season to season. 


traffic 

ex) There was a lot of traffic. 


weather 

ex) It's nice weather today. 


work 일, 직장, 직업 (job은 가산 명사)

ex) I'm looking for work. 





▶ 의미에 따라 가산명사가 되기도, 불가산명사가 되기도 하는 명사들


noise 구체적인 소음을 의미할 때는 가산 명사, 그렇지 않을 때는 불가산명사

ex) Did you hear a noise just now?

ex) I can't work here. There's too much noise. 


paper 신문을 의미할 때는 가산명사, 뭔가를 쓸 종이를 의미할 때는 불가산명사

ex) I bought a paper to read.

ex) I need some paper to write on. 


hair 머리카락 한 올을 의미할 때는 가산명사, 머리에 있는 머리카락 전부를 의미할 때는 불가산명사

ex) There's a hair in my soup. 

ex) You've got very long hair.


room 집에 있는 방을 의미할 때는 가산명사, 공간을 의미할 때는 불가산명사

ex) You can stay with us. There is a spare room. 

ex) You can't sit here. There isn't any room.


experience 내게 일어난 일들을 뜻할 때는 가산명사, 경험을 의미할 때는 불가산명사?

ex) I had some interesting experiences while I was traveling. 

ex) They offered me the job because I had a lot of experience.


coffee, tea, juice, beer 등은 보통 불가산명사이다. 그러나 한 잔의 커피, 두 잔의 커피를 의미할 때 a coffee, two coffees와 같이 사용 가능하다. 

ex) I don't like coffee very much.

ex) Two coffees and an orange juice, please. 



Posted by 톈진난만

댓글을 달아 주세요

▶ 영상에 로고 넣기


오늘은 영상에 로고 넣기를 해볼 것이다. 영상을 넣어줄 이미지와 로고는 각각 다음과 같다. 참고로 사진의 주인공은 천진대학교에 방문한 아빠..ㅎㅎ 로고는 천진대학교 로고이다. 




코드는 아래와 같은 내용으로 구성되어 있다. 


1. 로고를 넣을 영상 읽기

2. 로고 영상 읽기

3. 로고 영상 그레이 레벨로 읽기

4. 로고를 넣을 영상 및 로고 영상 사이즈 콘솔에 출력

5. 로고를 넣어줄 위치, 즉 관심영역(ROI) 설정 

6. 로고 흑백 영상을 마스크로 사용해서 로고를 ROI에 삽입


코드는 아래와 같다. 주석을 참고하자. 


#include <iostream>

#include <opencv2\core.hpp>

#include <opencv2\highgui.hpp>


int main()

{

cv::Mat father = cv::imread("father.jpg"); // 로고를 넣어줄 영상 읽기

cv::Mat logo = cv::imread("TJU_logo1.jpg"); // 로고 영상 읽기

cv::Mat logo_gray = cv::imread("TJU_logo1.jpg", CV_LOAD_IMAGE_GRAYSCALE); // 로고 영상 그레이 레벨로 읽기, 마스크로 사용하기 위해서


std::cout << "image size:"<< father.rows <<" x " << father.cols << ", logo size:" << logo.rows << " x " <<logo.cols << std::endl; // 로고 넣어줄 영상 및 로고 영상 사이즈 출력


cv::Mat imageROI(father, cv::Rect(father.cols - logo.cols, father.rows - logo.rows, logo.cols, logo.rows)); // 영상의 오른쪽 하단에서 영상 관심영역 (ROI) 정의 


cv::Mat mask(120 - logo_gray); // '120 - 로고 그레이 영상'을 마스크로 사용


logo.copyTo(imageROI, mask); // 마스크 값이 0이 아닌 위치에만 로고를 ROI에 삽입(로고의 흰 배경을 없애기 위한 방법)


cv::imshow("Image", father);  // 로고가 들어간 영상 전시

cv::waitKey(0);


return 0;

}


실행결과 아래와 같은 이미지가 출력된다. 로고가 영상 우측 하단에 삽입된 것을 확인할 수 있다. 원래 로고의 배경색이 흰색인데 흰색이 사라진 것에 주목하자. 



이미지 사이즈와 로고 사이즈는 아래와 같다. 




▶ 좀 더 알고 넘어갈 것들


1) 관심영역(ROI) 정의 관련


ROI는 region of interest의 약어로 관심영역을 뜻한다. 로고를 넣어줄 위치를 결정하기 위해서 ROI를 정의하는 것이 필요하다. 우리는 영상의 우측 하단에 로고를 넣어주기 위해서 관심 영역을 아래와 같이 코딩했다. 


cv::Mat imageROI(father, cv::Rect(father.cols - logo.cols, father.rows - logo.rows, logo.cols, logo.rows)); 


이 줄을 해석하면, father이라는 영상에서 직사각형(cv::Rect)의 ROI을 정의하는데, 그 직사각형의 왼쪽 상단 점의 위치는 father영상에서 (father영상의 가로 길이 - logo영상의 가로 길이, father영상의 세로 길이 - logo영상의 세로 길이)이고, 이 직사각형의 가로 길이는 logo의 가로 길이이고 세로 길이는 logo의 세로길이이다. 그니까 영상 우측 하단에 로고 크기 만큼의 ROI를 설정한 것이다. 



2) 마스크 설정 및 마스크를 활용한 로고 삽입 관련


아까 말했다시피 로고 영상의 배경색은 흰색이었다. 그래서 관심 영역을 설정한 후에 바로 거기에 로고를 삽입하면 그 배경색까지 그대로 삽입되어 버린다. 이런 식으로.. 



내 눈에는 별로 만족스럽지가 않다. (이게 더 마음에 드는 사람도 있겠지만.) 저 흰 배경을 없애주려면 마스크를 설정해주는 것이 필요하다. 


로고 영상을 그레이 스케일로도 읽은 이유가 여기에 있다. 그레이 스케일에서 흰색 배경은 255에 가까운 화소값들을 갖는다(참고로 검은색은 0에 가깝다). 지금 이 로고에서 흰 배경은 정확하게 255는 아니다. 


cv::Mat mask(120 - logo_gray);


그래서 위의 코드와 같이 120 - logo_gray을 해주면 흰 배경 부분은 다 0이 되어버리고, 나머지 푸른 색의 로고 부분만 0이 아닌 다른 숫자들을 갖게 된다. 로고 그레이 영상의 픽셀값들은 CV_8U, 즉 부호가 없는 8비트이기 때문이다. 120을 넘는 픽셀들은 모두 0이 되어버린다. 120은 몇차례 시행을 통해 괜찮은 값을 찾은 것이다. 로고에 따라 다른 수로 설정할 수 있다. 


logo.copyTo(imageROI, mask);


마스크를 이용해서 관심영역에 로고를 삽입하는데, 마스크의 값이 0이 아닌 위치에서만 로고가 삽입된다. 즉, 흰색 배경부분은 삽입되지 않는다. 




<참고자료>

[1] 로버트 라가니에 지음, 이문호 옮김, "OpenCV를 활용한 컴퓨터 비전 프로그래밍 3/e", 에이콘


Posted by 톈진난만

댓글을 달아 주세요

▶ 본문


사도행전 12:18-25

18 날이 새매 군인들은 베드로가 어떻게 되었는지 알지 못하여 적지 않게 소동하니

19 헤롯이 그를 찾아도 보지 못하매 파수꾼들을 심문하고 죽이라 명하니라 헤롯이 유대를 떠나 가이사랴로 내려가서 머무니라

20 헤롯이 두로와 시돈 사람들을 대단히 노여워하니 그들의 지방이 왕국에서 나는 양식을 먹는 까닭에 한마음으로 그에게 나아와 왕의 침소 맡은 신하 블라스도를 설득하여 화목하기를 청한지라

21 헤롯이 날을 택하여 왕복을 입고 단상에 앉아 백성에게 연설하니

22 백성들이 크게 부르되 이것은 신의 소리요 사람의 소리가 아니라 하거늘

23 헤롯이 영광을 하나님께로 돌리지 아니하므로 주의 사자가 곧 치니 벌레에게 먹혀 죽으니라

24 하나님의 말씀은 흥왕하여 더하더라

25 바나바와 사울이 부조하는 일을 마치고 마가라 하는 요한을 데리고 예루살렘에서 돌아오니라



▶ 묵상


모든 사람이 칭찬을 갈망하며 살아가고 있다. 누군가의 인정을 바라며 살고 있다. 칭찬을 기대하는 것은 사실 너무나 자연스러운 것이다. 우리는 칭찬과 인정을 통해서 힘을 얻곤 한다. 


칭찬 받는다는 것은 감사한 일이지만, 동시에 두려워할 일이다. 사람들에게 보여지는 나의 모습과 다른 사람들이 모르는 나의 실제 모습은 큰 차이가 있기 때문이다. 따라서 칭찬받는 순간에 하나님께 영광을 돌려야지, 내가 그 영광을 취해서는 안된다. 하나님이 나를 만드시고, 나에게 재능을 주시고, 나에게 그러한 상황을 허락하셨기 때문에 칭찬을 받을 수도 있는 것이지, 나의 어떠함으로 받은 것이 아니다. 


칭찬에 취해서 살지말고 성령 충만함으로 살아가자. 나는 연구를 왜하고 있을까? 사람들에게 나의 실력을 뽐내려고? 다른 사람들 위에 올라가려고? 나는 티스토리를 왜하고 있을까? 사람들의 공감, 댓글로 칭찬을 받으려고 하는 것인가? 그것을 통해 우쭐대려고?? 이런 마음이 없지 않은 것 같다. 교만했던 헤롯의 결말을 기억하자. 하나님께 영광을 돌리는 삶을 살자. 곰곰히 제대로 생각해보면 내가 칭송 받을 만한 것이 없다. 한 명의 악하고 악한 죄인일 뿐이다. 주님의 은혜를 덧입어 하루 하루 살아가는 존재일 뿐이다. 


"교만은 패망의 선봉이요 거만한 마음은 넘어짐의 앞잡이니라" (잠 16:19)


"젊은 자들아 이와 같이 장로들에게 순종하고 다 서로 겸손으로 허리를 동이라 하나님은 교만한 자를 대적하시되 겸손한 자들에게는 은혜를 주시느니라" (벧전 5:5)

Posted by 톈진난만

댓글을 달아 주세요

▶ 영상 위에 그림 그리고 글쓰 


영상을 불러와서 그 위에 사각형을 그리고, 글씨를 적어보려고 한다. 아래와 같은 절차를 밟을 것이다.


1. 영상 읽기

2. 영상 띄우기

3. 영상 위에 사각형 그리기- cv::rectangle

4. 영상 위에 글쓰기- cv::putText


코드는 아래와 같다. 코드에 주석을 달아놓았으니 참고하자. 


#include <opencv2/core.hpp>

#include <opencv2/highgui.hpp>

#include <opencv2/imgproc.hpp> // rectangle과 putText 함수 사용을 위해

#include <iostream>


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, 300), cv::Scalar(255, 0, 0), 3, 1, 0); // 사각형 그리기


cv::putText(image, "I like a pork cutlet!", cv::Point(30, 340), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(0, 0, 255), 2); // 글쓰기


cv::imshow("new", image);


cv::waitKey(0);


    return 0;

}


실행 결과 나온 두 개의 이미지를 보자. 



왼쪽은 원본 이미지이고, 오른쪽은 사각형과 글이 추가된 이미지이다. 



▶ 좀 더 알고 넘어갈 것들


1) cv::rectangle(입력 이미지, 사각형의 왼쪽 모서리 위치, 사각형의 아래쪽 모서리 위치, 색상, 선 굵기, 선 유형, shift)


색상은 cv::Scalar(255, 0, 0)이라고 코딩했는데, blue(B), green(G), red(R) 순서이므로 파란색이 된 것이다. 만약 cv::Scalar(0, 255, 0)라고 코딩했다면 초록색의 사각형이 생겼을 것이다. 

입력 매개변수들 중에서 가장 마지막 것인 shift는 어떤 의미를 갖는지 잘 모르겠지만 간단히 0으로 설정하면 된다.  


2) cv::putText(입력 이미지, 입력 문구, 문구 시작 위치, 폰트, 글자크기, 글자색상, 글자굵기)


기본적으로 한글은 지원되지 않는다. 


<참고자료>

[1] 로버트 라가니에 지음, 이문호 옮김, "OpenCV를 활용한 컴퓨터 비전 프로그래밍 3/e", 에이콘

Posted by 톈진난만

댓글을 달아 주세요



티스토리 툴바