Вопрос скорости OpenCV

Я хочу преобразовать много точек (лучше всего изображение в формате 720p) с ~ 30 кадрами в секунду.
Прямо сейчас я просто перебираю маску и ищу отмеченные пиксели. Затем я преобразую каждый отмеченный пиксель в новый кадр. Есть ли способ ускорить его?
Код работает на планшете Windows, поэтому я не знаю, может ли CUDA помочь.

//Look for white pixels in mask image and transform them to new frame orientation
for (int row = 0; row < mask.rows; row++){
for (int col = 0; col < mask.cols; col++){

if (mask.at<uchar>(row, col) == 255){

//Point in 2D hom
p = (Mat_<double>(3, 1) << col, row, 1);
p11 = CameraMatrix480.inv()*p;  //Pixel-->Camera//Project 2D Points to table
double d = abs((p11 - midCam).dot(table_normal_cam)); //intersection of point with table surface is z value
ps = p11 - d*table_normal_cam;
p11 *= -Mat(p11 - ps).at<double>(2);

//Get point in new frame in hom camera coordinates
p11.copyTo(p_hom1(Range(0, 3), Range(0, 1)));
p_hom2 = M * p_hom1; //p_hom in frame2

//Point in frame2 in pixel coordinates
p12 = (1 / p_hom2.at<double>(2))*(CameraMatrix480*p_hom2(Range(0, 3), Range(0, 1))); //Camera-->Pixel
pixel = Point(p12.at<double>(0), p12.at<double>(1));

//Check if new location is in the frame
if (rect.contains(pixel)){
RGB& rgb = output.ptr<RGB>(pixel.y)[pixel.x];
rgb = white;
}

}
}

0

Решение

Без тестирования я думаю, что вычисление матрицы обратной камеры — самая дорогая операция в вашем коде. Предполагая, что матрица камеры постоянна, вы можете предварительно вычислить обратное.

Mat invCameraMatrix(CameraMatrix480.inv());
...
p11 = invCameraMatrix*p;  //Pixel-->Camera
...

Кроме того, вы можете легко распараллелить for цикл с OpenMP и проверьте, получает ли это какую-либо производительность. Для использования CUDA вам понадобится видеокарта Nvidia, которая, вероятно, недоступна на вашем планшетном устройстве с Windows.

4

Другие решения

Можете ли вы попробовать использовать cv::UMat для тестирования производительности?

я использую OpenMP для быстрых операций с изображениями по пикселям.

0

Рассматривали ли вы изменить свои операции на float вместо double? Поскольку вы находитесь на мобильном устройстве, это может помочь ускорить операции.

Кроме того, что является rect напоследок if состояние?

0

Мне удалось запустить преобразование для изображения 720p за ~ 40 мсек, просто используя Matx вместо Mat. Изображения хранятся в UMat, возможно, это тоже помогло.

0
По вопросам рекламы [email protected]