我正在尝试从OpenCV并行编程中捕获网络摄像头。
当我捕获没有并行块的帧时,它可以使用60fps。
但是当它在OpenMP或TBB等并行块中工作时,它只能工作10~20fps。
特别是,VideoCapture::grab()
函数在并行块中需要更多的两倍或三倍。
下面有使用OpenMP或TBB的捕获编程代码。
使用openMP
#pragma omp parallel
#pragma omp sections
{
#pragma omp section
{
clock_t a1 = clock();
cap.grab();
printf("grab : %f\n", double(clock() - a1) / double(CLOCKS_PER_SEC));
cap.retrieve(Origin);
printf("cam : %f\n", double(clock() - a1) / double(CLOCKS_PER_SEC));
}
#pragma omp section
{
clock_t a2 = clock();
BOriginal.copyTo(OriginA);
cvtColor(AAOri, HSOriginA, COLOR_BGR2HSV);
HSOriginA.copyTo(HSOrigin);
}
}
使用TBB
task_scheduler_init init;
parallel_invoke([capture, Origin]()->void {
clock_t aas = clock();
cap.grab();
printf("grab time : %f\n", double(clock() - aas) / double(CLOCKS_PER_SEC));
cap.retrieve(Origin);
printf("cam time : %f\n", double(clock() - aas) / double(CLOCKS_PER_SEC));
},
[BOriginal, OriginA, HSOriginA, HSOrigin]()->void {
clock_t a2 = clock();
BOriginal.copyTo(OriginA);
cvtColor(OriginA, HSOriginA, COLOR_BGR2HSV);
HSOriginA.copyTo(HSOrigin);
});
在OpenMP中,捕获编程块无论是在omp master
还是在omp single
,omp section
,它的工作原理都是一样的。
如何在并行编程中立即捕获(grab()
,retrieve()
)。
我的环境是ARM处理器和Linux Fedora 3.10内核。