Ejemplo n.º 1
0
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());
}
Ejemplo n.º 2
0
  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;

  }