2016-12-12 150 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兩個臨時隨機數