OpenCV 학습 노트 (42) - 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 의 최근 정수 가 되 는 것 도 유용 한 함수 입 니 다. 필요 할 때 시도 해 보 는 것 을 추천 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.