How can I change the depth of a cv::Mat

I have a high resolution image to do guided filtering, so I need to change the depth from CV_8UC3 to CV_32FC3 to get base layer and detail layer. However a “convertTo()” is quite expensive, I guess under the hood it always does a element wise operation. My question is, can I just change the depth of a cv::Mat, just something like “img.astype(np.float32)” from numpy.

Have you test both method?

C++

   Mat img = imread(samples::findFile("lena.jpg"));
    float dt = 0;
    for (int i = 0; i < 100; i++)
    {
        auto start = std::chrono::high_resolution_clock::now();
        Mat imgf;
        img.convertTo(imgf,CV_32F);
        auto finish = std::chrono::high_resolution_clock::now();
        std::chrono::duration<double> dt0 = finish - start;
        dt += dt0.count();
    }
    std::cout << "Elapsed time: " << dt / 100 << " s\n";

python

import time
import numpy as np
import cv2 as cv

img = cv.imread(cv.samples.findFile("lena.jpg"))
dt = 0
for idx in range(100):
    deb = time.perf_counter_ns()

    imgf = img.astype(np.float32)
    fin = time.perf_counter_ns()
    dt = dt + fin-deb
print((dt)*1e-9/100)

result c++ 0.000456 s
result python 0.000546s per call

1 Like