이미지 읽기 &저장
Mat img_color = imread("sample.jpg"); // color load
Mat img_gray = imread("sample.jpg", 0); // gray load
imwrite("fname.jpg", img);
이미지 생성, 복사, 형변환, 색상변환, roi 설정
int w = 320; // width
int h = 240; // height
// 생성
Mat img(h,w,CV_8UC1); //1채널 unsigned char
Mat img(h,w,CV_8UC3); //3채널 unsigned char
Mat img = Mat::zeros(h,w,CV_32FC1);//1채널 float
Mat img = Mat::ones(h,w,CV_64FC3);//3채널 double
unsigned char * img_buffer; // 이미지버퍼 포인터
Mat img(h, w, CV_8UC3, img_buffer);//메모리 공유
// 원소 초기화
Mat img(h,w,CV_8UC1);
img = Scalar(3); // img 모든 원소값 3으로 초기화
// 참조, 복사
Mat img2 = img; // 메모리 공유
Mat img2 = img.clone(); // 별도 메모리
Mat img2; img.copyTo(img2);//별도 메모리
// 형변환 복사
Mat img1(h,w,CV_32FC1);
Mat img2;
img1.convertTo(img2, CV_8U);
// gray-color 변환
cvtColor(color, gray, CV_BGR2GRAY);
cvtColor(gray, color, CV_GRAY2BGR);
// roi 설정
Rect roi;
Mat sub_img = img(roi); //메모리공유
Mat sub_img = img(roi).clone(); //별도메모리
영상 크기변경 및 상하좌우 반전
// 크기 변경
Mat dst;
resize(img, dst, Size(new_w,new_h));
resize(img, dst, Size(), 0.5, 0.5); //scalex, scaley
// 영상 반전(flip)
flip(img, dst, 0); // vertical flip
flip(img, dst, 1); // horizontal flip
flip(img, dst, -1); // vertial &horizontal flip
이미지에 그리기 (drawing)
Rect rc(x,y,w,h);
Scalar color(B,G,R);
int thickness=1; // line thickness
line(img, Point(x1,y1), Point(x2,y2), color, thickness);
rectangle(img, rc, color, thickness);
rectangle(img, rc.tl(), rc.br(), color, thickness);
rectangle(img, rc, color, CV_FILLED);// filled rectangle
Point center(rc.x+rc.width/2, rc.y+rc.height/2);
Size radius(rc.width/2, rc.height/2);
double rot_deg = 0; // rotation of ellipse
double s_deg = 0; // start angle of arc
double e_deg = 360; // end angle of arc
ellipse(img,center,radius,rot_deg,s_deg,e_deg,color,thickness);
ellipse(img,center,radius,rot_deg,s_deg,e_deg,color,CV_FILLED);
int circle_radius = 10;
circle(img, center, circle_radius, color, thickness);
circle(img, center, circle_radius, color, CV_FILLED);
putText(img, "text", Point(x,y), FONT_HERSHEY_SIMPLEX, 1., color, thickness);
putText(img, "text", Point(x,y), FONT_HERSHEY_DUPLEX, 1., color, thickness);
이미지 디스플레이하기 (display)
namedWindow("name"); // auto resized
namedWindow("name",CV_WINDOW_NORMAL); // manual resize
imshow("name", img);
char ch = waitKey(); // 무한 대기
char ch = waitKey(10); // 10 msec 대기
if(ch == 27) ... // ESC key
if(ch == 32) ... // SPACE key
destroyWindow("name");
destroyAllWindows();
웹캠 연결하기
VideoCapture vc(0);
if (!vc.isOpened()) return; // 연결실패
vc.set(CV_CAP_PROP_FRAME_WIDTH, 640);
vc.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
Mat img;
while(1){
vc >>img;
if(img.empty()) break;
imshow("cam",img);
if(waitKey(10)==27) break; //ESC
}
destroyAllWindows();
avi 비디오 파일 읽어오기
VideoCapture vc("sample.avi");
if (!vc.isOpened()) return; // 불러오기 실패
Mat img;
while(1){
vc >>img;
if(img.emplty()) break;
imshow("video",img);
if(waitKey(10)==27) break; //ESC
}
destroyAllWindows();
avi 비디오 녹화하기
double fps = 15;
int fourcc = CV_FOURCC('X','V','I','D'); // codec
bool isColor = true;
VideoWriter *video = new VideoWriter;
if(!video->open("result.avi", fourcc, fps, Size(img_w, img_h), isColor)){
delete video;
return;
}
Mat img;
while(1){
// ...
*video << img;
// ...
}
delete video;
Mat <--> IplImage
Mat --> IplImage
Mat matimg;
IplImage* iplimh;
iplimg = &IplImage(matimg);
IplImage --> Mat
IplImage* iplimg;
Mat matimg;
matimg(iplimg);
픽셀 접근법
Mat image;
// 3 channel Image
for(int j=0; j < image.rows; j++)
{
for(int i=0; i < image.cols; i++)
{
image.at<Vec3b> (j,i)[0] += 30;
image.at<Vec3b> (j,i)[1] += 20;
image.at<Vec3b> (j,i)[2] += 20;
}
}
이때 Vec3b 는 unsigned char 형이다
b(unsigned char) 외에도 s(short), i(int), f(float), d(double) 형의 벡터가 존재한다.
* 추가사항 *
cv::Mat클래스의 at메소드를 사용한다면 가끔은 성가실 수 있다. 행렬 타입을 알고 있다면 cv::Mat의 템플릿 하위 클래스인 cv::Mat_ 클래스를 사용할 수 있다.
cv::Mat_<uchar> im2 = image; //im2는 image를 참조
im2(50,100) = 0; // 50행 100열 화소에 접근
출처: http://jangjy.tistory.com/21 [살다보니..]
'Programming > openCV' 카테고리의 다른 글
polygon Detection (0) | 2017.05.03 |
---|---|
사진 인식 (0) | 2017.04.22 |
BGR별 히스토그램 구하기 (0) | 2017.04.11 |
vector에 접근하는 두가지 방법 (0) | 2017.04.11 |
13. Hough Circles (0) | 2017.04.04 |