※ 행렬 데이터 생성 = 메모리를 새로 생성하지 않고 공유함

// y-행에 대한 행렬 헤더 생성

cv::row(int y)

 

// x-열에 대한 행렬 헤더 생성

cv:col(int x)

 

// y-행에 대한 행렬 헤더 생성
cv::row(int y)

// x-열에 대한 행렬 헤더 생성
cv:col(int x)

// 부분 행렬 헤더 생성
cv::Mat cv::colRange(int startcol, int endcol) const
cv::Mat cv::rowRange(int startrow, int endrow) const
 
 
// 전치 행렬 변환
cv::MatExpr cv::Mat::t() const

 

// 이미지 파일 읽기
cv::Mat image_color = cv::imread("image.jpg");
cv::Mat image_gray  = cv::imread("image.jpg", 0);

// 생성

// 1채널 unsigned char
cv::Mat mat(h, w, CV_8UC1);
// 3채널 unsigned char
cv::Mat mat(h, w, CV_8UC3);

cv::Mat mat = cv::Mat::zeros(h, w, CV_32FC1);
cv::Mat mat = cv::Mat::ones(h, w, CV_64FC3);

unsigned char *pbBuffer; // 이미지 버퍼
cv::Mat mat(h, w, CV_8UC3, pbBuffer); // 메모리 공유

// 원소 초기화
cv::Mat mat(h, w, CV_8UC1);
// 모든 원소값을 3으로 초기화
mat = cv::Scalar(3);

cv::Mat mat2 = mat;	// 메모리 공유
cv::Mat mat3 = mat.clone();	// 별도 메모리
cv::Mat mat4;
mat.copyTo(mat4);	// 별도 메모리

// 형변환 복사
cv::Mat matf(h, w, CV_32FC1);
cv::Mat matb;
matf.convertTo(matb, CV_8U);

// color-gray 변환
cv::cvtColor(color, gray, CV_BGR2GRAY);
cv::cvtColor(gray, color, CV_GRAY2BGR);

// ROI
cv::Rect roi;
cv::Mat mat_roi = mat(roi);
cv::Mat mat_roi = mat(roi).clone();

// Resize
cv::resize(src, dst, cv::Size(w2, h2));
// Scale(sx, sy)
cv::resize(src, dst, cv::Size(), sx, sy);

// Flip
cv::flip(src, dst, 0);	// vertical flip
cv::flip(src, dst, 1);	// horizontal flip
cv::flip(src, dst, -1);	// vertical & horizontal flip

// Drawing
cv::Rect rc(x, y, w, h);
cv::Scalar color(B, G, R);
int thickness = 1;

cv::line(img, cv::Point(x1, y1), cv::Point(x2, y2), color, thickness);

cv::Rectangle(img, rc, color, thickness);
cv::Rectangle(img, rc.tl(), rc.br(), color, thickness);
cv::Rectangle(img, rc, color, CV_FILLED);

cv::Point center(rc.x + rc.width / 2, rc.y + rc.height / 2);
cv::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
cv::ellipse(img, center, radius, rot_deg, s_deg, e_deg, color, thickness);
cv::ellipse(img, center, radius, rot_deg, s_deg, e_deg, color, CV_FILLED);

int circle_radius = 10;
cv::circle(img, center, circle_radius, color, thickness);
cv::circle(img, center, circle_radius, color, CV_FILLED);

cv::putText(img, "text", cv::Point(x, y), FONT_HERSHEY_SIMPLEX, 1, color, thickness);
cv::putText(img, "text", cv::Point(x, y), FONT_HERSHEY_DUPLEX, 1, color, thickness);

// display
cv::namedWindow("name");	// auto resized
cv::namedWindow("name", CV_WINDOW_NORMAL);	// manual resize

cv::imshow("name", img);
char ch = cv::waitKey();	// 무한대기
char ch = cv::waitKey(10);	// 10 ms 대기

cv::destroyWindow("name");
cv::destroyAllWindows();

 

cv::VideoCapture vc(0);           // webcam
cv::VideoCapture vc("video.mp4"); // video file

if (!vc.isOpened())
    return; // failed

vc.set(CV_CAP_PROP_FRAME_WIDTH, 640);
vc.set(CV_CAP_PROP_FRAME_HEIGHT, 480);

cv::Mat img;
for (;;)
{
    vc >> img;
    if (img.empty())
        break;

    cv::imshow("image", img);
    if (cv::waitKey(10) == 27) // ESC
        break;
}

cv::destroyAllWindows();

 

double fps = 30;
int fourcc = CV_FOURCC('X', 'V', 'I', 'D'); // XVID codec
bool isColor = true;

cv::VideoWriter* video = new cv::VideoWriter;
if (!video->open("video.avi", fourcc, fps, cv::Size(w, h), isColor))
{
    delete video;
    return;
}

cv::Mat img;
for (;;)
{
    ;
    *video << img;
    ;
}

delete video;

 

// cv::Mat -> cv::IplImage
cv::Mat img;
cv::IplImage* pIplImg = &IplImage(img);

// cv::IplImage -> cv::Mat
IplImage* pIplImg;
cv::Mat img(pIplImg);

// 3 channels image
for (int r = 0; r < img.rows; ++r)
{
    for (int c = 0; c < img.cols; ++c)
    {
        img.at<Vec3b>(r, c)[0] += 10;
        img.at<Vec3b>(r, c)[1] += 20;
        img.at<Vec3b>(r, c)[2] += 30;
    }
}

// cv::Mat_<T>
cv::Mat_<unsigned char> img2 = img;
img2(r, c) = v;

+ Recent posts