Skip to content

Instantly share code, notes, and snippets.

@arwer13
Created December 13, 2016 07:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save arwer13/c58f0275c0923933295c7afbdd1a7da8 to your computer and use it in GitHub Desktop.
Save arwer13/c58f0275c0923933295c7afbdd1a7da8 to your computer and use it in GitHub Desktop.
void train(cv::Mat &image) {
cv::cvtColor(image, image, CV_BGR2YCrCb);
const size_t w = image.cols;
const size_t h = image.rows;
double mean_cb = 0.0;
double mean_cr = 0.0;
double mean_cb2 = 0.0;
double mean_cr2 = 0.0;
double mean_crcb = 0.0;
double i = 1.0;
//TODO: #pragma omp parallel for
for (size_t x = 0; x < h; x++) {
const uchar* const row = image.ptr(x);
for (size_t y = 0; y < w; y++) {
const uchar cb = row[y*NUM_CHANNELS + 1];
const uchar cr = row[y*NUM_CHANNELS + 2];
// QUESTION: better not to play with inline functions here, yeah?
mean_cb = ((i-1.0)/i) * mean_cb + cb/i;
mean_cr = ((i-1.0)/i) * mean_cr + cr/i;
mean_cb2 = ((i-1.0)/i) * mean_cb2 + cb*cb/i;
mean_cr2 = ((i-1.0)/i) * mean_cr2 + cr*cr/i;
mean_crcb = ((i-1.0)/i) * mean_crcb + cr*cb/i;
i += 1.0;
}
}
// TODO: Mat cameraMatrix = (Mat_<double>(3,3) << 1000, 0, 320, 0, 1000, 240, 0, 0, 1);
cv::Mat cov(2, 2, CV_64F);
cov.at<double>(0, 0) = mean_cb2;
cov.at<double>(0, 1) = cov.at<double>(1, 0) = mean_crcb - mean_cb*mean_cr;
cov.at<double>(1, 1) = mean_cr2;
cov = cov.inv();
cv::Mat means(1, 2, CV_64F);
means.at<double>(0, 0) = mean_cr;
means.at<double>(0, 1) = mean_cb;
write_model(MODEL_FILE_NAME, cov, means);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment