2016-12-12 72 views
0

我正在寻找一种将值分配给3通道矩阵元素的有效方法。具体地讲,我需要HSV值分配给被初始化的2D cv::Mat的元件如下:将HSV值分配给特定像素?

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; 
} 
+0

这不是重复的!我是另一个问题,我根本不明白答案。 –

+0

然后详细说明您尝试过的代码以及为什么它不起作用。也许有人会在编辑完成后重新打开你的问题。 –

+0

我用我的代码 –

回答

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); 
+0

这就是我一直在寻找的 –

1

是的,你可以使这个效率更高。

您可以直接或多或少地分配到CV :: Mat。假设你的系统是底层的RGB,只需设置一个CV :: Mat宽度和高度,并有三个或四个通道(通常是一个虚拟alpha使事情快一点)。然后查看HSV 59,255,255的rgb值 - 有很多公式 - 并直接设置它们。我认为你可以使用“at”成员函数,但这是基于对CV :: Mat界面的随意浏览。

最后,你可以摆脱点x,y坐标的向量i和j,假设你以后不需要它们。刚上numberOfDots和generatate两个临时随机数