깊이 이해 cv:: Mat

16558 단어
코드 구현
4. 567914 류 는 이미지 (및 기타 행렬 데이터) 를 저장 하 는 데이터 구조 이다.모든 OpenCV 클래스 와 함수 에서 이 데이터 구 조 는 핵심 적 인 위 치 를 차지한다.상위 코드:
#include 

#include 
#include 

// test function that creates an image
cv::Mat function() {

	// create image
	cv::Mat ima(500, 500, CV_8U, 50);
	// return it
	return ima;
}

int main() {

	// define image windows
	cv::namedWindow("Image 1");
	cv::namedWindow("Image 2");
	cv::namedWindow("Image 3");
	cv::namedWindow("Image 4");
	cv::namedWindow("Image 5");
	cv::namedWindow("Image");

	// create a new image made of 240 rows and 320 columns
	cv::Mat image1(240, 320, CV_8U, 100);
	// or:
	// cv::Mat image1(240,320,CV_8U,cv::Scalar(100));

	cv::imshow("Image", image1); // show the image
	cv::waitKey(0); // wait for a key pressed

	// re-allocate a new image
	// (only if size or type are different)
	image1.create(200, 200, CV_8U);
	image1 = 200;

	cv::imshow("Image", image1); // show the image
	cv::waitKey(0); // wait for a key pressed

	// create a red color image
	// channel order is BGR
	cv::Mat image2(240, 320, CV_8UC3, cv::Scalar(0, 0, 255));

	// or:
	// cv::Mat image2(cv::Size(320,240),CV_8UC3);
	// image2= cv::Scalar(0,0,255);

	cv::imshow("Image", image2); // show the image
	cv::waitKey(0); // wait for a key pressed

	// read an image
	cv::Mat image3 = cv::imread("G:\\OpenCV2pictures\\puppy.bmp");

	// all these images point to the same data block
	cv::Mat image4(image3);
	image1 = image3;

	// these images are new copies of the source image
	image3.copyTo(image2);
	cv::Mat image5 = image3.clone();

	// transform the image for testing
	cv::flip(image3, image3, 1);

	// check which images have been affected by the processing
	cv::imshow("Image 3", image3);
	cv::imshow("Image 1", image1);
	cv::imshow("Image 2", image2);
	cv::imshow("Image 4", image4);
	cv::imshow("Image 5", image5);
	cv::waitKey(0); // wait for a key pressed

	// get a gray-level image from a function
	cv::Mat gray = function();

	cv::imshow("Image", gray); // show the image
	cv::waitKey(0); // wait for a key pressed

	// read the image in gray scale
	image1 = cv::imread("G:\\OpenCV2pictures\\puppy.bmp", CV_LOAD_IMAGE_GRAYSCALE);

	// convert the image into a floating point image [0,1]
	image1.convertTo(image2, CV_32F, 1 / 255.0, 0.0);

	cv::imshow("Image", image2); // show the image
	cv::waitKey(0); // wait for a key pressed

	return 0;
}

실행 결과:
2. 실현 원리
1. cv: Mat 는 두 가지 필수 적 인 구성 부분 이 있 습 니 다. 하 나 는 머리 와 하 나 는 데이터 블록 입 니 다.머리 에는 행렬 의 모든 관련 정보 (크기, 채널 수량, 데이터 형식) 가 포함 되 어 있다.데이터 블록 은 그림 의 모든 픽 셀 값 을 포함 합 니 다.머리 에 데이터 블록 을 가리 키 는 지침, 즉 data 속성 이 있 습 니 다.
2. cv:: Mat 는 명확 한 요구 가 있 을 때 만 메모리 블록 이 복 사 됩 니 다.실제로 대부분의 작업 은 cv:: Mat 의 머리 만 복 사 했 기 때문에 여러 대상 이 같은 데이터 블록 을 동시에 가리킨다.이런 메모리 관리 모델 은 응용 프로그램의 운행 효율 을 높 여 메모리 누 출 을 피 할 수 있다.
3 、 원소 의 종 류 를 지정 할 때 CV8U 는 각 픽 셀 이 1 바이트 에 대응 하고 알파벳 U 로 기호 가 없 음 을 표시 하 며 알파벳 S 는 기호 가 있 음 을 나타 낸다.컬러 그림 에 대해 서 는 3 채널 유형: CV8UC3, 16 비트 의 정수: CV16SC 3, 32 비트 의 부동 소수점: CV32F。
4. 두 그림 사이 에 값 을 부여 할 때 이미지 데이터 (즉 픽 셀) 는 복사 되 지 않 습 니 다. 이때 두 그림 은 모두 같은 메모리 블록 을 가리 키 고 있 습 니 다.그 중의 어떤 것 을 변환 하 더 라 도 다른 이미지 에 영향 을 줄 수 있다.그림 내용 을 깊이 복사 하려 면 copy To 방법 을 사용 할 수 있 습 니 다.
참고서: 《 OpenCV 컴퓨터 시각 프로 그래 밍 공략 》

좋은 웹페이지 즐겨찾기