将HSV值分配给特定像素?

时间:2016-12-12 19:05:04

标签: c++ opencv

我正在寻找一种为3通道矩阵的元素赋值的有效方法。特别是,我需要将HSV值分配给2D cv::Mat的元素,其初始化如下:

cv::Mat clusterImage(height,width,CV_8UC3,cv::Scalar(0,0,0));

对于此矩阵,如何尽可能高效地将行i和列j中的像素设置为HSV值(H = 59,S = 255,V = 255)?

我目前的方法(完整代码)如下。我担心将矩阵分成通道,编辑这些通道然后将它们合并在一起并不是非常有效 - 特别是因为我需要在循环中进行,最好是在30Hz及以上。是否存在更有效的方法?

#include <vector>
#include <stdlib.h>
#include <iostream>

#include <opencv/cv.h>
#include <opencv/highgui.h>

using namespace std;

int main() {
  int height = 480;
  int width = 640;

  cv::Mat clusterImage(height,width,CV_8UC3,cv::Scalar(0,0,0));
  vector<cv::Mat> channels(3);

  // split the channels
  split(clusterImage, channels);

  // modify the channels
  vector<int> i;
  vector<int> j;
  int numberOfDots = 1000;

  for (int k=0; k<numberOfDots; k++) {
    i.push_back(rand() % height + 1);
    j.push_back(rand() % width + 1);
  }

  for (int k=0; k<numberOfDots; k++) {
    channels[0].at<unsigned char>(i[k],j[k]) = 59;
    channels[1].at<unsigned char>(i[k],j[k]) = 255;
    channels[2].at<unsigned char>(i[k],j[k]) = 255;
  }

  // merge channels
  merge(channels, clusterImage);

  // convert to RGB and draw
  cv::cvtColor(clusterImage, clusterImage, CV_HSV2BGR);
  imshow("test_window", clusterImage);

  cv::waitKey(0);

  return 0;
}

2 个答案:

答案 0 :(得分:1)

是的,你可以提高效率。

您可以或多或少直接分配到CV :: Mat。假设你的系统是基础RGB,只需设置一个宽度和高度的CV :: Mat,并设置三个或四个通道(通常是虚拟alpha使事情变得更快)。然后查找HSV 59,255,255的rgb值 - 有很多公式 - 并直接设置它们。我想你可以使用&#34; at&#34;成员函数,但这是基于对CV :: Mat界面的一瞥。

最后,你可以摆脱点x,y co-cordinates的向量i和j,假设你以后不需要它们。只需循环numberOfDots并生成两个临时随机数

答案 1 :(得分:1)

这段代码将是我的选择:

  int height = 480;
  int width = 640;

  cv::Mat clusterImage(height,width,CV_8UC3,cv::Scalar(0,0,0));

  int numberOfDots = 1000;
  int i , j;

  for (int k=0; k<numberOfDots; k++) 
  {
    i = rand() % height ; j = rand() % width ;

    clusterImage.at<Vec3b>(i , j )[0] = 59;
    clusterImage.at<Vec3b>(i , j )[1] = 255;
    clusterImage.at<Vec3b>(i , j )[2] = 255;
  }

  // convert to RGB and draw
  cv::cvtColor(clusterImage, clusterImage, CV_HSV2BGR);
  imshow("test_window", clusterImage);

  cv::waitKey(0);