cvtColor太慢了

时间:2016-01-03 21:47:46

标签: c++ opencv mat

我正在制作一个项目,我需要改变亮度,图像的对比度,它的亮度而不是亮度。 所以我的代码一开始是

for (int y = 0; y < dst.rows; y++) {
    for (int x = 0; x < dst.cols; x++) {

        int b = dst.data[dst.channels() * (dst.cols * y + x) + 0];
        int g = dst.data[dst.channels() * (dst.cols * y + x) + 1];
        int r = dst.data[dst.channels() * (dst.cols * y + x) + 2];
... other processing stuff i'm doing

并且它很好,做得非常快,但是当我尝试将hsv转换为hsl以设置我需要的l值时,它会变得非常缓慢;

我的hsl到hsl代码行是

        cvtColor(dst, dst, CV_BGR2HSV);

        Vec3b pixel = dst.at<cv::Vec3b>(y, x); // read pixel (0,0) 
         double H = pixel.val[0];
         double S = pixel.val[1];
         double V = pixel.val[2];
           h = H;
           l = (2 - S) * V;
           s = s * V;
           s /= (l <= 1) ? (l) : 2 - (l);
           l /= 2;

              /* i will further make here the calcs to set the l i want */
           H = h;
           l *= 2;
           s *= (l <= 1) ? l : 2 - l;
           V = (l + s) / 2;
           S = (2 * s) / (l + s);

           pixel.val[0] = H;
           pixel.val[1] = S;
           pixel.val[2] = V;

           cvtColor(dst, dst, CV_HSV2BGR);

并且我跑了它并且很慢,所以我采取了线条,看看哪一个让它变慢,我发现它是cvtColor(dst, dst, CV_BGR2HSV); 那么有一种方法可以让它比使用cvtCOlor更快,或者它的时间问题是可以处理的吗?

1 个答案:

答案 0 :(得分:2)

我认为(我没有打开文本编辑器,但似乎)你需要在HSV中生成整个图像,然后为整个图像调用cvtColor一次。这意味着您应该为每个像素调用一次cvtColor而不是一次。这应该会大大提高你的速度。

你会这样做:

  cvtColor(dst, dst, CV_BGR2HSV);

  for (int y = 0; y < dst.rows; y++) {
      for (int x = 0; x < dst.cols; x++) {


        Vec3b pixel = dst.at<cv::Vec3b>(y, x); // read current pixel 
         double H = pixel.val[0];
         double S = pixel.val[1];
         double V = pixel.val[2];
           h = H;
           l = (2 - S) * V;
           s = s * V;
           s /= (l <= 1) ? (l) : 2 - (l);
           l /= 2;

           H = h;
           l *= 2;
           s *= (l <= 1) ? l : 2 - l;
           V = (l + s) / 2;
           S = (2 * s) / (l + s);

           pixel.val[0] = H;
           pixel.val[1] = S;
           pixel.val[2] = V;
    }
}

cvtColor(dst, dst, CV_HSV2BGR);