관심쟁이 영호

[#5] OpenCV(with.c++)ㅣ이미지 파일, 영상파일 읽기 본문

학교공부/OpenCV

[#5] OpenCV(with.c++)ㅣ이미지 파일, 영상파일 읽기

관심쟁이 영호 2020. 11. 8. 01:30
반응형

안녕하세요!

관심쟁이 영호입니다.

오늘은 OpenCV에 관해서 공부를 해볼 예정입니다!

바로 보시죠.

 


오늘의 주제는

이미지 파일, 영상파일을

읽어오는 겁니다.

영상처리에 있어서 가장 필수적인 부분이라고 생각하시면 됩니다!

 

1. 이미지 파일

이미지 파일은 앞서 우리가 공부했던 

Mat타입의 행렬을 이용하면 아주 쉬워요!

 

2차 원창에 행렬로 된 데이터를 띄워주면 그것이 바로 이미지인데요!

실제 우리가 사용하는 jpg, png 이런 값들도

 

18 12 15 16 19

13 89 88 89 12

10 87 67 88 33

23 92 86 88 21

13 13 16 21 14    <- 이렇게 네모난 상자에 표시되어 있는 데이터입니다!

 

이 값들이 색 값을 나타내는 값이고 컴퓨터는 해당하는 값에 맞게 색을 표출하여 이미지가 되는 것이죠!

 

그럼 밖에서 저장되어 있는 jpg는 이러한 행렬 정보일 것이고..

이 행렬 정보를 읽어와서 미리 선언해둔 Mat타입의 공간에 짚어 넣어주어야 합니다!

그때 사용하는 함수가 imread입니다!

 

그럼 코드로 살펴보기 전에!

불러올 이미지를 살펴볼게요!

 

 

이 이미지를 불러올게요!

코드를 보시죠!

코드입니다!

 

결과창은!

위에 있는 사진에 없던 사각형을 그려보았어요!

그리고 그 해당 사각형에 있는

3채널 행렬 값을 출력해보았습니다.

 

이전에 설명했듯이 RGB 값을 표기하기 위해서 3 채널로 이루어져 있어요!

한마디로 위에 행렬에 맨 처음 "137, 43, 20"이 값이 행렬의 1.1 값이라고 생각하시면 됩니다.

3개가 1개의 세트!

 

코드 올려드릴게요!

 

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

void main() {
	
	string filename = "../image/sample_image2.jpg"; //현재 cpp파일이 저장되어있는 곳 한단계 위에서 image파일로 이동!
	Mat image = imread(filename, IMREAD_COLOR); // 파일값 읽어와서 image에 복사!
    
	CV_Assert(image.data); // 예외!

	Rect roi(100,100, 10,10);
	

	cout << "불러온 \"image\"의 행렬값 = " << endl << image(roi) << endl; //"roi"범위에 있는 행렬정보만!
	rectangle(image, roi, Scalar(180, 180, 180), 1);
	imshow("이미지 읽어오기", image);
	
	waitKey(0);
	

}

 

 

짚고 넘어야 할 점을 볼게요!

CV_Assert

이것은 읽어온 파일이 없거나 에러가 뜨게 된다면 해당 에러를 화면에 출력하도록 도와주는 예외처리입니다!

인자로 넘어간 "image.data"가 없으면! 예외!!

한마디로 위쪽에서 말한 경로로 가서 sample_imag2라는 값이 없게 된다면

not found exception? 이 떠버리죠!

 

2. 비디오 영상 읽어오기

비디오 영상은 사진영상이랑 많이 달라요 ㅠ

사진을 적게는 수백 장 많게는 수십만 장을 연속적으로 나타내어 화면이 움직이는 것처럼 나타내는 거죠!

(어릴 때 책 한 장 한 장에 말을 그리고 발의 위치만 살짝 바꿔주고 촤르륵 넘겨주면 말이 뛰어가는 거처럼요!!)

 

OpenCV에서 이러한 비디오를 받아오기 위해서는

반복문을 이용하여 캡처 캡처 캡처~~ 해서 계속 표출하도록 해주는 방법이에요!

 

코드로 살펴볼게요!

이렇게 구성했고요!

저거 비디오 영상이에요.. ㅋㅋㅋㅋ

캡처할라..ㅎㅎ

 

시계가 돌아가는지 확인하려고 찍은 겁니다!

정상적으로 돌아가는 것을 확인할 수 있어요!

여기에도 짚고 넘어가야 할 부분들이 많아요 ㅠㅠ

일단 코드 보실게요!

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;




void main() {
	
	string filename = "../image/my_clock.mp4"; //문자열변수에 파일경로와 파일명 입력저장
    
	VideoCapture capture; //비디오캡쳐타입 변수지정
    
	capture.open(filename); // 비디오 파일 오픈!
    
	CV_Assert(capture.isOpened()); // 예외처리!
    

	double frame_rate = capture.get(CAP_PROP_FPS); // 초당 프레임 수!
    
	int frame_cnt = 0; //현재의 프레임 번호!(다른 작업하려다가.. ㅋㅋ 지우질 못했네요)
    
	int delay = 1000 / frame_rate; // 지연시간
    
	Mat frame; // 캡쳐해서 읽어올 행렬변수!
    
	while (capture.read(frame)) {  //반복문을 이용하여 반복적으로 행렬정보를 "frame"에 저장!

		if (waitKey(delay) >= 0)break; 
        
		imshow("동영상을 읽어보자!", frame); //"frame"에 저장된 행렬을 출력!

	}
	
	waitKey(0);
	

}

이렇게 보시면 됩니다!

 

다음 시간에는 조금 더 보충 공부를 해볼게요!

프레임, 지연시간 등등을 보충해보도록 하겠습니다.

 

오늘은 여기까지!

 


읽어주셔서 정말 감사합니다!

 

300x250
Comments