Можно ли сравнивать OpenCV с плавающей точкой? Или это можно сделать более эффективным каким-то другим способом?

Название плохого вопроса, я знаю, извините.

У меня есть этот маленький кусочек кода, который очень неэффективен и медленный и часто называется:

    // frequencies is a 256 element cv::Mat array, already with values
    // values in frequencies may exceed 255
    // grey is a cv::Mat, type CV_8U
    cv::Mat inc, inc32;

    for (int i = 0; i < 256; i++) {
        inc = (grey > i);   
        inc.convertTo(inc32, CV_32F);
        frequencies[i] = inc32/255 + frequencies[i];
    }

inc становится типом CV_8U, потому что это то, что compare (или ‘>’) возвращает, но мне нужна плавающая точка 1.0 или 0.0. Поэтому я должен преобразовать его в inc32, а затем разделить на 255. Это кажется действительно неэффективным и медленным, делая дополнительный cv::Mat без реальной причины.

Вместо этого я попытался сделать добавление элемента, но это было катастрофой (примерно в 3 раза медленнее).

Итак, есть ли более эффективный способ, которым я могу это сделать, например, каким-то образом сделать compare store a 1.0 в мате типа float? I’m thinking of re-implementing the OpenCV compare to do what I need, or maybe a strategy that requires the Mat to be contiguous, but i’M new(ish) to OpenCV and don’t want to reinvent wheels or write fragile code just yet.

Для тех, кто может быть заинтересован, я пишу гистограмму на основе времени на пиксель, чтобы я мог получить любой квантиль, который мне нравится (например, кадр медианных пикселей по времени или первый квартиль . . .) Возможно, уже есть лучший способ сделать это, который я пропустил. Код работает, он просто намного медленнее, чем я надеялся.

Спасибо за любые указатели заранее! (Советы типа указателей, а не другой вид, хотя они тоже приветствуются.)

1 ответ

  1. Очевидное исправление состоит в том, чтобы сделать математику на CV_8U, до преобразования. Я бы тоже не стал использовать подразделение, а просто & 1маску.

    Однако, вы должны понимать, что OpenCV удобство приходит по цене. Вы говорите «дополнительный cv:: Mat», но я считаю больше: inc = (серый>i), inc32, а также inc32/255.