2012-05-20 4 views
1

나는 다음과 같은 방법루프없이 opencv 매트의 행을 정규화하는 방법은 무엇입니까?

Mat temp, rp;  
for (int i = 0; i <= descriptors1.rows - 1; i++) 
{ 
    normalize(descriptors1.row(i), temp); 
    rp = normd1.rowRange(i, i+1); 
    temp.copyTo(rp); 
} 

위의 descriptors1은 매트입니다 그것을했다.

그러나 루프를 사용하는 것은 시간이 많이 걸립니다. 이것을 할 수있는 더 좋은 방법이 있습니까?

감사합니다.

답변

1

루프에는 아무런 문제가 없습니다. Matlab에 대해 들었던 것과는 달리 C++에서는 속도가 느리지 않습니다! 매우 시간에 민감한 응용 프로그램에서이 값을 사용하려면 각 반복에서 i <= descriptors1.rows - 1 검사를 제거하도록 루프를 최적화 할 수 있습니다. temp을 사용하면 normd1.rowRangenormalize에 직접 전달하여 시간을 절약하고 단 한 줄로 처리 할 수 ​​있습니다.

편집 :이 방법은 normalize(A.row(i), _OutputArray(B.ptr(i), B.cols))이거나 _OutputArray 인 템플릿 버전을 사용할 수 있습니다. 당신이 각 반복에서 루프를 작성한 방식으로 컴파일러가 평가되는대로 descriptors1.rows - 1을 평가해야합니다. rows은 상수가 아니며 루프의 함수를 이해하지 못하는 경우가 많습니다.

for (i = descriptors1.rows - 1; i >= 0; i--) 

비록, 당신이 최적화되어 있는지 확인하기 위해 컴파일러에 의해 생성 된 코드를 확인하고, 또한 루프 언 롤링을 고려해야합니다 그래서 내가 좋아하는 뭔가를 변경합니다. 이것이 코드 병목 현상이라면 Google은 최적화 루프에 대한 많은 자료를 찾을 수 있습니다.

+0

1 'i <= descriptors1.row-1' 검사가 제거 된 경우 마지막 행이 처리 된 후 루프를 중지하는 방법은 무엇입니까? 2, 정규 표현식 (A.row (i), B.row (i))은 불법으로 보인다. – beaver

+0

수정 된 답변을 참조하십시오. – fireant

관련 문제