[OpenCV #5]cv::Mat 클래스,복사,픽셀 접근

OpenCV/example 2013. 2. 19. 14:01

Mat 클래스의 객체 정의

 

기본적으로 0x0의 크기를 갖는 영상 정의

#include<opencv\cv.h>

#include<opencv\highgui.h>

using namespace cv;
using namespace std;
int main()
{
 Mat image;
 
 cout<<"size:"<<image.size().height<<","<<image.size().width<<endl;
 
 return 0;

}

 

기본적으로 0x0의 크기를 갖지만, 초기 크기를 지정할 수 있다.

이미지 가로 세로, 값 0~255(8U = unsigned 8bit), graysccale(C1,1-channel)

 

#include<opencv\cv.h>
#include<opencv\highgui.h>

using namespace cv;
using namespace std;
int main()
{
 int w=150,h=100;
 Mat image(h,w,CV_8UC1);
 
 cout<<"size:"<<image.size().height<<","<<image.size().width<<endl;
 
 return 0;

}

 

그리고 색상 지정 및 이미지 보기

 

#include<opencv\cv.h>
#include<opencv\highgui.h>

using namespace cv;
using namespace std;
int main()
{
 int w=150,h=100;
 Mat image(h,w,CV_8UC1,Scalar(255));
 
 cout<<"size:"<<image.size().height<<","<<image.size().width<<endl;
 imshow("image",image);
 waitKey(0);
 return 0;

}

1-channel with the floating-point value(32F = float 32bit)

Mat imageFloat(h,w,CV_32FC1);

Scalar(255)

3-channel image with values 0~255 for each channel

Mat imageRGB(h,w,CV_8UC3)

Scalar(0,0,255)

 

Mat 클래스의 복사본

//colne() or copyTo() 복사함수

Mat B=image.clone();  //새로운 복사본 생성* colne()

 

Mat B;
image.copyTo(B); //* copyTo()

Mat B=image; //같은 데이터를 참조하는 두 영상

 

#include<opencv\cv.h>
#include<opencv\highgui.h>

using namespace cv;
using namespace std;
int main()
{

 Mat image = imread("sistar.jpg",0); //Load image form disk
 if(!image.data) return -1; //Check image
 
 //Mat B=image.clone(); //새로운 복사본 생성
 Mat B=image; //같은 데이터를 참조하는 두 영상
 threshold(B, B, 100, 255, CV_THRESH_BINARY);

 imshow("sistar", image); //Show image
 imshow("B", B); //Show image
 waitKey(0); //Wait for keystroke
 return 0;

} 

 

관심 영역 자르기

#include<opencv\cv.h>
#include<opencv\highgui.h>

using namespace cv;
using namespace std;
int main()
{

 Mat image = imread("sistar.jpg"); //Load image form disk
 if(!image.data) return -1; //Check image
 
 Rect rect(100,30,150,300);
 Mat subimage=image(rect);
 imshow("sistarROI",subimage); //Show image
 
 waitKey(0); //Wait for keystroke
 return 0;

}

 

//if you want to copy data:

image(rect).copyTo(subimage);

 

이미지 픽셀 접근하기

 

at을 이용한 1-채널 이미지 픽셀에 접근

//Get values

int value = image.at<uchar>(y,x);

//Set tje values

image.at<uchar>(y,x) = 100;

at을 이용한 3-채널 이미지 픽셀에 접근

//Get values

int value = image.at<Vec3b>(y,x)[c];

//Set tje values

image.at<Vec3b>(y,x)[c] = 100;

 

응용(영상 밝기 조정)

 

 

#include<opencv\cv.h>
#include<opencv\highgui.h>

using namespace cv;
using namespace std;
int main()
{
 double alpha=1.0;//1.0~3.0
 int beta=50;//0~100
 Mat image = imread("sistar.jpg"); //Load image form disk
 Mat new_image = Mat::zeros(image.size(),image.type());
 if(!image.data) return -1; //Check image
 
 
 for(int y = 0; y < image.rows; y++)
 {
  for(int x = 0;x < image.cols; x++)
  {
   for(int c = 0; c < 3; c++)
   {
    new_image.at<Vec3b>(y,x)[c]=
     saturate_cast<uchar>(alpha * (image.at<Vec3b>(y,x)[c]) + beta);
   }
  }
 }
 imshow("sistar",new_image); //Show image
 
 waitKey(0); //Wait for keystroke
 return 0;

}


반응형

'OpenCV > example' 카테고리의 다른 글

[OpenCV #7]이진 영상 변환(threshold)  (0) 2013.03.04
[OpenCV #6]split and merge  (0) 2013.02.20
[OpenCV #4]관심 영역  (0) 2013.02.14
[OpenCV #3]Threshold  (0) 2013.02.14
[OpenCV #2]이미지에서 RGB 채널 분리  (1) 2013.02.14