void ClientTransfer::dataReceived(PeerPtr, const QByteArray &data) { // TODO: proper error handling (relay to core) if (!_file) { _file = new QFile(_savePath, this); if (!_file->open(QFile::WriteOnly|QFile::Truncate)) { qWarning() << Q_FUNC_INFO << "Could not open file:" << _file->errorString(); return; } } if (!_file->isOpen()) return; if (_file->write(data) < 0) { qWarning() << Q_FUNC_INFO << "Could not write to file:" << _file->errorString(); return; } emit transferredChanged(transferred()); }
cv::Mat nscale::Normalization::TransferI(cv::Mat fg_lab, cv::Mat fg_mask, float meanT[3], float stdT[3]) { float meanLAB[3], stdLAB[3]; cv::Mat transferred(fg_lab.size(), CV_32FC3);; std::vector<cv::Mat> lab; split(fg_lab, lab); /* mask1 = ~isnan(im) & (im~=-Inf); mask1 = mask1(:,1).*mask1(:,2).*mask1(:,3); valid_im = im(find(mask1>0),:);*/ cv::Mat multres = lab[0].mul(lab[1]); multres = multres.mul(lab[2]); cv::Mat mask1 = (multres > 0); cv::bitwise_and(mask1, fg_mask, mask1); /* meanI = mean(valid_im); stdI= std(valid_im); */ // calculates mean and std for LAB channels for(int n = 0; n < 3; n++){ double sum = 0.0; double sq_sum = 0.0; int count = 0; for(int i = 0; i < lab[n].rows; i++){ float *labi_ptr = lab[n].ptr<float>(i); unsigned char *mask1_ptr = mask1.ptr<unsigned char>(i); for(int j =0; j < lab[n].cols; j++){ if(mask1_ptr[j]){ sum += labi_ptr[j]; sq_sum += labi_ptr[j] * labi_ptr[j]; count++; } } } double mean = sum / count; double variance = sq_sum / count - mean * mean; double std = sqrt(variance); // std::cout << "Mean: "<< mean << " std: "<< std<< " sq_sum: "<< sq_sum<<std::endl; meanLAB[n] = mean; stdLAB[n] = std; } // std::cout << "After mean" << std::endl; /* % scale the data [N,d] = size(valid_im); new_im = valid_im - repmat(meanI, N, 1); new_im = repmat(stdT./stdI, N, 1).*new_im; new_im = new_im + repmat(meanT, N, 1); */ // std::cout << "transfer: LAB(0,0): "<< lab[0].ptr<float>(0)[0] <<" (0,1):"<< lab[1].ptr<float>(0)[0] <<" (0,2):"<< lab[2].ptr<float>(0)[0] << std::endl; for(int i = 0; i < 3; i++){ lab[i] -= meanLAB[i]; lab[i] *= stdT[i]/stdLAB[i]; lab[i] += meanT[i]; } // std::cout << "transfer: LAB(0,0): "<< lab[0].ptr<float>(0)[0] <<" (0,1):"<< lab[1].ptr<float>(0)[0] <<" (0,2):"<< lab[2].ptr<float>(0)[0] << std::endl; // merge lab channels into a single multi-channel image cv::merge(lab, transferred); //std::cout << "transfer after merge: LAB(0,0): "<< transferred.ptr<float>(0)[0] <<" (0,1):"<< transferred.ptr<float>(0)[1] <<" (0,2):"<< transferred.ptr<float>(0)[2] << std::endl; // release temporary data. It would be released automatically, buy why not doing it explicitly? lab[0].release(); lab[1].release(); lab[2].release(); multres.release(); mask1.release(); return transferred; }