2016-12-12 5 views
0

私は3チャンネルマトリックスの要素に値を割り当てる効率的な方法を探しています。特に、私は、次のように初期化された2D cv::Matの要素にHSV値を割り当てる必要があり:このマトリックスについて特定のピクセルにHSV値を割り当てますか?

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

、IはHSV値に行i及び列j内のピクセルを設定しない方法(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と、3つまたは4つのチャンネルを設定するだけです(多くの場合、ダミーのアルファは物事を少し速くします)。次に、HSV 59,255,255のrgb値を調べます。数多くの数式があり、それらを直接設定します。私はあなたが "at"メンバ関数を使うことができると思うが、これはCV :: Matインターフェイスのカジュアルな一見に基づいている。

最後に、後で必要がないと仮定して、ドットx、y座標のベクトルiとjを取り除くことができます。 numberOfDotsとgeneratate 2つの一時乱数

関連する問題