1

안녕하세요, 저는 그레이 스케일 이미지를 빠르게 스케일링 할 필요가 있습니다. 그래서 vImage를 시도하고 응용 프로그램이 충돌합니다. 제발 도와주세요. 아래 코드에서 srcimg.data/dstimg.data는 부호없는 char 이미지 데이터 (단일 채널 만 회색 데이터)를 가리 킵니다.가속 프레임 워크 (vImage)를 사용하여 그레이 스케일 이미지를 스케일하는 방법

 
        vImage_Buffer src; 
        src.data=srcimg.data; 
        src.height=srcimg.cols; 
        src.width=srcimg.rows; 
        src.rowBytes=srcimg.cols; 

        vImage_Buffer dest; 
        dest.data=dstimg.data; 
        dest.height=dstimg.cols; 
        dest.width=dstimg.rows; 
        dest.rowBytes=dstimg.cols; 
        vImageScale_Planar8(&src, &dest, NULL, kvImageNoFlags); 

+0

srcimg와 dstimg는 cv :: resize (srcimg, dstimg, dstimg.size())로 위 코드를 대체하면 opencv의 cv :: Mat 객체입니다. 앱이 예상대로 실행되지만 느리게 실행됩니다. – pradeepa

+0

안녕하세요 Davids가 문제를 해결하고 응용 프로그램이 더 이상 작동하지 않지만 이전보다 느리게 실행되면 vImage를 효율적으로 사용하는 방법을 알려주세요. – pradeepa

답변

0

첫 번째 의견은 일반적으로 높이가 행이되고 너비 열이 - 사용하는 방식이 이상하게 보입니다.

당신이 목적지 이미지에 대한 메모리의 malloc 않았다

dstimg.data = malloc에 ​​(dstimg.cols * dstimg.rows을);

배치 대상을 ios5 이상으로 설정 했습니까?

iOS5에서 아무런 문제없이 Accelerate 프레임 워크를 사용했습니다.

+0

고맙습니다. 문제가 해결되었습니다. src.height = srcimg.rows src.width = srcimg.cols; 하지만 그것은 이전보다 느린 것 같습니다. vImage를 올바르게 사용하고 있습니까? 속도가 빨라야합니까? – pradeepa

+0

아니요, 모든 경우에 속도 증가를 보장하지는 않습니다. 이 호출을 여러 번하는 경우 필요한 버퍼를 prealloc 할 수 있습니다 (이미지가 같은 크기라고 가정). 속도는 행 또는 열의 값이 아니라 처리 된 픽셀 수에 따라 다릅니다. 이진 요소로 크기를 줄이는 경우 다른 픽셀, 모든 행 등을 "속이거나"잡아서 훨씬 빠르게 만들 수 있습니다. –

+0

vImage 버퍼가 매번 다시 만들어지면 캐시를 워밍업하지 않기 때문에 최적의 성능보다 느리게 종료됩니다. –

1

cv::resize은 기본적으로 선형 보간법을 사용합니다. vImageScale_Planar8Lanczos resampling을 사용합니다.이 것은 더 복잡하지만 품질이 훨씬 좋습니다. 당신은 사과와 오렌지를 비교하고 있습니다.

2

vImage/Geometry.h의 리샘플링 API의 경우 더 빠른 속도가 아닌 더 나은 품질을 제공하기 위해 벡터 단위를 사용했습니다. 벡터 유닛은 일반적으로 메모리에 흩어져있는 액세스를 수행하는 데 매우 취약하기 때문에 비 단위 스트라이드로 선형 또는 가장 가까운 이웃 리샘플링과 같은 간단한 작업을 수행하는 것이 대부분입니다. 가장 가까운 이웃을 만들거나 선형 필터링을 빠르게 만드는 것처럼 보이지 않았습니다. 그래서 대신 Lanczos 필터링을 사용했습니다. Lanczos 필터링을 사용하면 인접한 픽셀의 더 큰 영역을보고 각 결과 픽셀을 파악할 수 있습니다. 그것은 굉장해 보인다 (나는 생각한다). 그러나 그것은 awesomeness를 얻는 더 많은 작업이다.

또한 선형 또는 가장 가까운 이웃 필터링을 원한다면 GPU에 하드웨어가 있어야합니다.

vImage의 일반적인 API는 자신의 롤링보다 더 빠른 결과를 제공하기위한 것입니다.