OpenCV 소 백 학습 노트 (3) 이미지 처리
매트 대상
**1.Mat IplImage
2.Mat
3.Mat **
Mat 대상 OpenCV 2.0 이후 도 입 된 이미지 데이터 구조, 자동 할당 메모리, 메모리 누 출 문제 가 없 는 대상 지향 데이터 구조 다.두 부분 으로 나 뉘 어 져 있 습 니 다. 머리 와 데이터 부분 인 IplImage 는 2001 년 OpenCV 발표 이후 존재 해 왔 습 니 다. C 언어 스타일 의 데이터 구조 로 개발 자가 스스로 메모 리 를 분배 하고 관리 해 야 합 니 다. 큰 프로그램 을 사용 하면 메모리 누 출 문제 가 발생 하기 쉽 습 니 다.
Mat 대상 상용 구조 함수
1. Mat () 는 Mat 대상 을 만 들 고 구조 할 때 어떠한 조작 도 하지 않 습 니 다.
// Mat
Mat img;
2. Mat (int rows, int cols, int type) 사용자 가 지정 한 줄 수, 열 수, 유형 에 따라 Mat 대상 을 만 듭 니 다.
// 3*3 , 8 uchar , 1 Mat
Mat img= Mat(3,3,CV_8UC1);
3. Mat (Size size, int type) 사용자 가 지정 한 크기 와 유형 에 따라 Mat 대상 을 만 듭 니 다.
// Mat src, src , 3*3 , 8 uchar , 1 Mat
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat img= Mat(src.size(),CV_8UC1);
4. Mat (int rows, int cols, int type, const Scalar & s) 는 사용자 가 지정 한 줄 수, 열 수, 유형 에 따라 Mat 대상 을 만 들 고 모든 픽 셀 의 값 을 초기 화 합 니 다. 벡터 길 이 는 채널 수 에 대응 해 야 합 니 다.
// 3*3 , 8 uchar , 3 Mat , (127,0,255)
Mat img= Mat(3,3,CV_8UC3,Scalar(127,0,255))
5. Mat (Size size, int type, const Scalar & s) 사용자 가 지정 한 크기 와 유형 에 따라 Mat 대상 을 만 들 고 모든 픽 셀 의 값 을 초기 화 합 니 다. 벡터 길 이 는 채널 수 에 대응 해 야 합 니 다.
// Mat src, src , 3*3 , 8 uchar , 3 Mat , (127,0,255)
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat img= Mat(src.size(),CV_8UC3,Scalar(127,0,255));
6. 배열 구 조 는 행렬 데이터 로 Mat 대상 을 구성한다.
// 3*3
// 0 -1 0
// -1 5 -1
// 0 -1 0
// Mat
Mat mat = (Mat_(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
Mat 대상 상용 방법
1. void copyTo (Mat mat) Mat 대상 딥 카피
// src dst
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat dst;
src.copyTo(dst);
2. void converto (Mat dst, int type) Mat 대상 전환 함수
// src 8 uchar , 3 Mat ( )
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat dst;
str.converto(dst,CV_8UC3);
3. Mat clone () Mat 대상 딥 카피
// src dst
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat dst;
dst.clone(src);
4. int channels () 현재 그림 을 가 져 오 는 채널 수
// src
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
int channel = src.channels();
5. int depth () 현재 그림 의 깊이 가 져 오기
// src
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
int channel = src.depth();
6. bool empty () 그림 이 비어 있 는 지 판단 합 니 다.
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat dst;
src.empty(); //false
dst.empty(); //true
7. uchar * ptr (i = 0) 현재 그림 의 지침 가 져 오기
// src
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
const unchar* fisrtRow = src.ptr(0);
8. Mat zeros (int rows, int cols, int type) 는 0 개의 Mat 대상 을 만 듭 니 다.
// 2*2 8 uchar , 1 0 Mat
Mat img = Mat::zeros(2,2,CV_8UC1)
9. Mat eye (int rows, int cols, int type) 대각선 이 1 인 Mat 대상 만 들 기
// 2*2 8 uchar , 1 1 Mat
//1 0
//0 1
Mat img = Mat::eye(2,2,CV_8UC1)
1. 그림 을 출력 하 는 메모 리 는 자동 으로 분 배 됩 니 다. 2. OpenCV 의 C + + 인 터 페 이 스 를 사용 합 니 다. 메모리 배분 문 제 를 고려 할 필요 가 없습니다. 3. 할당 작업 과 복사 구조 함 수 는 머리 부분 만 복사 합 니 다. 4. clone 과 copy To 두 함수 로 데 이 터 를 완전히 복사 합 니 다.
Mat 개체 생 성 (추가)
cv:: Mat:: Mat 구조 함수 Mat M (2, 2, CV 8UC 3, Scalar (0, 0, 255) 그 중에서 앞의 두 매개 변 수 는 각각 줄 (row) 과 열 (column), 세 번 째 CV 를 나타 낸다.8UC3 중의 8 은 각 채널 이 8 위 를 차지 하고 U 는 기호 가 없 음 을 나타 내 며 C 는 Char 유형 을 나타 내 고 3 은 채널 수 를 3 으로 나타 내 며 네 번 째 매개 변 수 는 벡터 로 각 픽 셀 수 치 를 초기 화 하 는 것 이 얼마 인지 나타 내 고 벡터 길 이 는 대응 채널 수 와 일치 합 니 다.
다 차원 배열 cv:: Mat:: create int sz [3] = {2, 2, 2} 만 들 기;Mat L(3,sz, CV_8UC1, Scalar::all(0));
cv:: Mat:: create 실현
Mat M;
M.create(4, 3, CV_8UC2);
M = Scalar(127,127);
cout << "M = " << endl << " " << M << endl << endl;
uchar* firstRow = M.ptr<uchar>(0);
printf("%d", *firstRow);
코드 사례
#include
#include
#include
#include
using namespace cv;
using namespace std;
int main(int argc, char** args) {
Mat image = imread("D:/test.jpg", IMREAD_GRAYSCALE);
if (image.empty()) {
cout << "could not find the image resource..." << std::endl;
return -1;
}
namedWindow("My Image", CV_WINDOW_AUTOSIZE);
imshow("My Image", image);
Mat M;
M.create(4, 3, CV_8UC2);
M = Scalar(127,127);
cout << "M = " << endl << " " << M << endl << endl;
uchar* firstRow = M.ptr<uchar>(0);
printf("%d
", *firstRow);
Mat C = (Mat_<double>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
cout << "C = " << endl << " " << C << endl << endl;
waitKey(0);
return 0;
}
영상 조작
1. 그림 읽 기 2. 픽 셀 읽 기 3. 픽 셀 값 수정
그림 읽 기
imread 는 그 레이스 케 일이 나 RGB 이미지 Imwrite 로 불 러 와 그림 파일 을 저장 할 수 있 습 니 다. 형식 은 확장자 에 의 해 결 정 됩 니 다.
읽 기와 쓰기 픽 셀
1. GRAY 픽 셀 점 의 픽 셀 값 (CV 8UC1) Scalar intensity = img. at (y, x) 읽 기;또는 Scalar intensity = img. at (Point (x, y);
2. RGB 픽 셀 점 의 픽 셀 값 Vec3f intensity = img. at (y, x) 읽 기;float blue = intensity.val[0]; float green = intensity.val[1]; float red = intensity.val[2];
픽 셀 값 수정
그 레이스 케 일 이미지 img. at (y, x) = 128;
RGB 3 채널 이미지 img. at (y, x) [0] = 128; /blue img.at(y,x)[1]=128; // green img.at(y,x)[2]=128; // red
공백 이미지 할당 img = Scalar (0);
ROI 는 Rect r (10, 10, 100, 100) 를 선택한다.Mat smallImg = img®;
Vec3b 와 Vec3F
Vec3b 가 대응 하 는 3 채널 의 순 서 는 blue, green, red 의 uchar 형식 데이터 입 니 다.
Vec3f 3 채널 에 대응 하 는 float 형식 데이터
CV 를8UC1 을 CV32F 1 로 전환 하면 다음 과 같다. src. convertto (dst, CV 32F);
코드 사례
#include
#include
#include
#include
using namespace cv;
using namespace std;
int main(int argc, char** args) {
Mat image = imread("D:/test.jpg", IMREAD_COLOR);
if (image.empty()) {
cout << "could not find the image resource..." << std::endl;
return -1;
}
int height = image.rows;
int width = image.cols;
int channels = image.channels();
printf("height=%d width=%d channels=%d", height, width, channels);
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
if (channels == 3) {
image.at<Vec3b>(row, col)[0] = 0; // blue
image.at<Vec3b>(row, col)[1] = 0; // green
}
}
}
namedWindow("My Image", CV_WINDOW_AUTOSIZE);
imshow("My Image", image);
waitKey(0);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ip camera android에 액세스하고 java를 사용하여 모니터에 표시그런 다음 PC에서 다운로드 폴더를 추출해야 합니다 그런 다음 프로젝트 폴더에 다운로드한 javacv 라이브러리를 추가해야 합니다. 먼저 라이브러리 폴더를 마우스 오른쪽 버튼으로 클릭한 다음 jar/폴더 추가를 선택...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.