OpenCV 학습 노트 (42) - Mat 데이터 조작 의 일반 청년, 문예 청년, 폭력 청년

우선 소 울 친구 가 제 가 'OpenCV 학습 노트 (40) - OpenCV 데이터 구조 Mat 상세 해' 라 는 메 시 지 를 남 겨 주 셔 서 감사합니다.이것 은 나 로 하여 금 테스트 해 보 려 는 충동 을 불 러 일 으 켰 다.다음은 제 테스트 결 과 를 보 여 드 리 겠 습 니 다.
저 는 여기 서 Mat 데 이 터 를 조작 하 는 세 가지 방법 을 테스트 했 습 니 다. 유행 어, 일반 청년, 문예 청년 을 사용 하 는데 왜 세 번 째 는 제 가 2b 청년 이 라 고 부 르 지 않 습 니까? 여러분 들 은 천천히 뒤 를 돌아 보 세 요.
일반 청년의 조작 방법 은 보통 M. at < float > (i, j) 이다.
문예 청년 은 보통 노선 M. ptr < float > (i) [j]
폭력 청년 은 보통 내 가 40 강 에서 언급 한 M. data 라 는 지침 을 직접 강제 적 으로 사용한다.
실험 코드 는 다음 과 같다.
	t = (double)getTickCount();
	Mat img1(1000, 1000, CV_32F);
	
	for (int i=0; i<1000; i++)
	{
		for (int j=0; j<1000; j++)
		{
			img1.at<float>(i,j) = 3.2f;
		}
	}
	t = (double)getTickCount() - t;
	printf("in %gms
", t*1000/getTickFrequency()); //*************************************************************** t = (double)getTickCount(); Mat img2(1000, 1000, CV_32F); for (int i=0; i<1000; i++) { for (int j=0; j<1000; j++) { img2.ptr<float>(i)[j] = 3.2f; } } t = (double)getTickCount() - t; printf("in %gms
", t*1000/getTickFrequency()); //*************************************************************** t = (double)getTickCount(); Mat img3(1000, 1000, CV_32F); float* pData = (float*)img3.data; for (int i=0; i<1000; i++) { for (int j=0; j<1000; j++) { *(pData) = 3.2f; pData++; } } t = (double)getTickCount() - t; printf("in %gms
", t*1000/getTickFrequency()); //*************************************************************** t = (double)getTickCount(); Mat img4(1000, 1000, CV_32F); for (int i=0; i<1000; i++) { for (int j=0; j<1000; j++) { ((float*)img3.data)[i*1000+j] = 3.2f; } } t = (double)getTickCount() - t; printf("in %gms
", t*1000/getTickFrequency());

마지막 두 가지 방법 은 모두 청년 을 폭력 적 으로 만 드 는 방법 으로 볼 수 있다. 어차피 지침 의 조작 이기 때문에 각 폭력 청년 수단 을 제한 하면 폭력 적 으로 보이 지 않 는 다.
Debug, Release 모드 에서 의 테스트 결 과 는 다음 과 같다.
테스트 결과
 
Debug
Release
보통 청년
139.06ms
2.51ms
문예 청년
66.28ms
2.50ms
폭력 청년
4.95ms
2.28ms
폭력 청년
5.11ms
1.37ms
테스트 결과 에 따 르 면 소 명 이 말 한 것 은 믿 을 만하 다 고 생각 합 니 다. 일반 청년들 의 조작 은 Debug 모드 에서 과연 느 리 고 그 가 추천 한 문예 청년의 노선 이 확실히 향상 되 었 습 니 다.주의해 야 할 것 은 원래 뒤의 두 가지 방법 은 확실히 2b 청년 을 비교 하 는 방법 이다. at 연산 자 나 ptr 연산 자 는 모두 메모리 검사 가 있 기 때문에 조작 이 경 계 를 넘 는 것 을 방지 하고 data 라 는 지침 을 직접 사용 하 는 것 은 확실히 위험 하 다.하지만 속도 적 으로 눈 에 띄 기 때문에 나 는 이런 청년 을 2b 라 고 부 르 지 못 하고 폭력 청년 이 라 고 존칭 할 수 없다.
그러나 Release 버 전에 서 는 몇 가지 방법의 속도 차이 가 뚜렷 하지 않 고 모두 평범한 청년 이다.그래서 마지막 으로 프로그램 을 발행 할 때 이 몇 가지 조작 방법 에 신경 쓰 지 않 아 도 됩 니 다. 앞의 두 가 지 를 추천 합 니 다. 모두 좋 은 쓰기 입 니 다. 지침 을 조작 하 는 일 은 신 들 에 게 남 겨 두 세 요.여기까지 하 겠 습 니 다.
보충: 소 명 은 두 가지 문예 청년의 처리 방안 을 추 천 했 습 니 다. 저도 마음대로 테스트 를 했 습 니 다. 먼저 코드 를 붙 이 고 테스트 결 과 를 붙 였 습 니 다.
	/*********   ********/
	t = (double)getTickCount();
	Mat img5(1000, 1000, CV_32F);
	float *pData1;
	for (int i=0; i<1000; i++) 
	{ 
		pData1=img5.ptr<float>(i);
		for (int j=0; j<1000; j++) 
		{ 
			pData1[j] = 3.2f; 
		} 
	} 
	t = (double)getTickCount() - t;
	printf("in %gms
", t*1000/getTickFrequency()); /******* *****/ t = (double)getTickCount(); Mat img6(1000, 1000, CV_32F); float *pData2; Size size=img6.size(); if(img2.isContinuous()) { size.width = size.width*size.height; size.height = 1; } size.width*=img2.channels(); for(int i=0; i<size.height; i++) { pData2 = img6.ptr<float>(i); for(int j=0; j<size.width; j++) { pData2[j] = saturate_cast<float>(3.2f); } } t = (double)getTickCount() - t; printf("in %gms
", t*1000/getTickFrequency());

테스트 결과:
 
Debug
Release
문예 청년
5.74ms
2.43ms
궁극 판 문예 청년
40.12ms
2.34ms
제 테스트 결과 에 따 르 면 이 두 가지 방안 은 금상첨화 의 효과 일 뿐 이 고 여러분 의 조작 에 더 많은 선택 을 하 게 되 었 다 고 생각 합 니 다. 그러나 속도 적 으로 수량 급 의 향상 이 없 는 것 같 습 니 다. 소 명 이 저 에 게 블 로그 에 대한 지지 에 다시 한 번 감 사 드 립 니 다.나중에 소 명 이 saturate캐 스 트 가 겨우 속 도 를 내 렸 는데, 나 는 동의 해서 테스트 결 과 를 붙 이지 않 았 다.근 데 제 가 자 료 를 보니까 알 아 봤 어 요.
saturate_캐 스 트 의 역할.
유형 에 대한 강제 전환 으로 볼 수 있 습 니 다. 예 를 들 어 saturatecast < uchar > 의 경우 데 이 터 를 8bit 의 0 ~ 255 구간 으로 바 꾸 고 마이너스 가 0 이 되 며 255 보다 큰 것 은 255 가 된다.부동 소수점 데이터 라면 round 의 최근 정수 가 되 는 것 도 유용 한 함수 입 니 다. 필요 할 때 시도 해 보 는 것 을 추천 합 니 다.

좋은 웹페이지 즐겨찾기