मैं opencv ईएम एल्गोरिथ्म का उपयोग करने के रंग extraction.I opencv दस्तावेज में उदाहरण के आधार पर निम्न कोड का उपयोग कर रहा करने के लिए कोशिश कर रहा हूँ के आधार पर:OpenCV: रंग निष्कर्षण गाऊसी मिश्रण मॉडल
cv::Mat capturedFrame (height, width, CV_8UC3);
int i, j;
int nsamples = 1000;
cv::Mat samples (nsamples, 2, CV_32FC1);
cv::Mat labels;
cv::Mat img = cv::Mat::zeros (height, height, CV_8UC3);
img = capturedFrame;
cv::Mat sample (1, 2, CV_32FC1);
CvEM em_model;
CvEMParams params;
samples = samples.reshape (2, 0);
for (i = 0; i < N; i++)
{
//from the training samples
cv::Mat samples_part = samples.rowRange (i*nsamples/N, (i+1)*nsamples/N);
cv::Scalar mean (((i%N)+1)*img.rows/(N1+1),((i/N1)+1)*img.rows/(N1+1));
cv::Scalar sigma (30,30);
cv::randn(samples_part,mean,sigma);
}
samples = samples.reshape (1, 0);
//initialize model parameters
params.covs = NULL;
params.means = NULL;
params.weights = NULL;
params.probs = NULL;
params.nclusters = N;
params.cov_mat_type = CvEM::COV_MAT_SPHERICAL;
params.start_step = CvEM::START_AUTO_STEP;
params.term_crit.max_iter = 300;
params.term_crit.epsilon = 0.1;
params.term_crit.type = CV_TERMCRIT_ITER|CV_TERMCRIT_EPS;
//cluster the data
em_model.train (samples, Mat(), params, &labels);
cv::Mat probs;
probs = em_model.getProbs();
cv::Mat weights;
weights = em_model.getWeights();
cv::Mat modelIndex = cv::Mat::zeros (img.rows, img.cols, CV_8UC3);
for (i = 0; i < img.rows; i ++)
{
for (j = 0; j < img.cols; j ++)
{
sample.at<float>(0) = (float)j;
sample.at<float>(1) = (float)i;
int response = cvRound (em_model.predict (sample));
modelIndex.data [ modelIndex.cols*i + j] = response;
}
}
मेरे यहां सवाल यह है:
सबसे पहले, मैं प्रत्येक मॉडल को यहां पूरी तरह से पांच निकालना चाहता हूं, फिर उन अलग पिक्सेल मानों को पांच अलग-अलग मैट्रिक्स में संग्रहीत करना चाहता हूं। इस मामले में, मेरे पास अलग-अलग पांच अलग-अलग रंग हो सकते थे। यहां मैंने केवल अपनी अनुक्रमणिका प्राप्त की है, क्या उनके संबंधित रंगों को यहां प्राप्त करने का कोई तरीका है? इसे आसान बनाने के लिए, मैं इन पांच जीएमएम के आधार पर प्रमुख रंग खोजने से शुरू कर सकता हूं।
दूसरा, यहां मेरा नमूना डेटापॉइंट "100" है, और इसमें लगभग 3 सेकंड लगते हैं। लेकिन मैं इन सभी चीजों को 30 मिलीसेकंड से अधिक नहीं करना चाहता हूं। मुझे ओपनसीवी पृष्ठभूमि निष्कर्षण पता है, जो जीएमएम का उपयोग कर रहा है, 20ms से नीचे वास्तव में तेज़ प्रदर्शन करता है, इसका मतलब है कि मेरे लिए सभी 600x800 = 480000 पिक्सेल के लिए 30 एमएस के भीतर ऐसा करने का एक तरीका होना चाहिए। मैंने पाया predict
फ़ंक्शन सबसे अधिक समय लेने वाला है।
क्या यह प्रश्न अभी भी सक्रिय है? या इसे हल किया गया था [http://stackoverflow.com/questions/12909343/opencv-how-to-categorize-gmm-calculated-probs/12909985#12909985)? सम्मान – remi
@remi: यह प्रश्न पुराना था, लेकिन मैंने एक और सवाल पूछा कि आपने उत्तर दिया है, मैंने इसे रंग निष्कर्षण और गणना की गति के साथ अपडेट किया है। क्या तुम मेरी मदद कर सकते हो? धन्यवाद। –
मैं वास्तव में इस सवाल को समझ नहीं पा रहा हूं। रंग निकालने से मुझे कोई समझ नहीं आती है। क्या आप प्रमुख रंगों की गणना करने की कोशिश कर रहे हैं? या रंगों को मापें? आपका कोड मुझे बहुत मदद नहीं करता है। 'Params.cov_mat_type = COV_MAT_DIAGONAL' का उपयोग करके गति समस्या के बारे में अधिकतर मामलों के लिए पर्याप्त है और आपकी प्रक्रिया को तेज करेगा – remi