Пример #1
0
//骨架化
void CImageProcess::Thinning(Image &source, Image &dst){
	memset(dst._pData, 0, dst._height * dst._width);
	IplImage *tmp = CreateImage(source);
	IplImage *tmp_d = CreateImage(dst);
	cv::Mat src(tmp, 0);
	cv::Mat	dst_t(tmp_d);
	dst_t = src.clone();
	dst_t /= 255;         // convert to binary image

	cv::Mat prev = cv::Mat::zeros(dst_t.size(), CV_8UC1);
	cv::Mat diff;

	do {
		ThinningIteration(dst_t, 0);
		ThinningIteration(dst_t, 1);
		cv::absdiff(dst_t, prev, diff);
		dst_t.copyTo(prev);
	} 
	while (cv::countNonZero(diff) > 0);

	dst_t *= 255;
	IplImage tmp_(dst_t);
	IplImge2Image(&tmp_, dst);
	ReleaseUserImage(&tmp);
	ReleaseUserImage(&tmp_d);
}
Пример #2
0
    void merge (string &src_, string &dest_)
    {
        string tmp_ (src_.size () + dest_.size (), 0);

        std::merge (src_.begin (), src_.end (), dest_.begin (), dest_.end (),
            tmp_.begin ());
        dest_ = tmp_;
    }
Пример #3
0
void DrawMolecule::update_cov_scale() {
  const Timestep *ts = current();
  if (!ts) return;
  int i, n = ts->num;
  // only do this if there are atoms
  if (!n) return;

  float covx, covy, covz;
  float minposx, minposy, minposz;
  float maxposx, maxposy, maxposz;

  // flags for selected atoms in displayed reps
  ResizeArray<int> tmp_(n);  // so I free automatically on return
  int *on = &tmp_[0];
  for (i=0; i<n; i++) on[i] = 0;
  for (int j=0; j<repList.num(); j++) {
    const DrawMolItem *rep = repList[j];
    if (!rep->displayed()) continue;
    const int *flgs = rep->atomSel->on;
    for (i=0; i<n; i++) on[i] |= flgs[i];
  }
  // find the first on atom
  int istart = -1;
  for (i=0; i<n; i++) {
    if (on[i]) {
      istart = i;
      break;
    }
  }
  if (istart < 0) {
    // no selected atoms.  Use all coordinates in this case.
    istart = 0;
    for (i=0; i<n; i++) on[i] = 1;
  }

  // initialize min/max positions with values from the first on atom
  const float *mpos = ts->pos + 3*istart;
  minposx = maxposx = mpos[0];
  minposy = maxposy = mpos[1];
  minposz = maxposz = mpos[2];
  covx = covy = covz = 0.0;

  int icount = 0;
  for (i=istart; i<n; ++i, mpos += 3) {
    if (!on[i]) continue;
    ++icount;
  
    const float xpos = mpos[0];
    const float ypos = mpos[1]; 
    const float zpos = mpos[2]; 

    covx += xpos;
    covy += ypos;
    covz += zpos;

    if (xpos < minposx) minposx = xpos;
    if (xpos > maxposx) maxposx = xpos;

    if (ypos < minposy) minposy = ypos;
    if (ypos > maxposy) maxposy = ypos; 

    if (zpos < minposz) minposz = zpos;
    if (zpos > maxposz) maxposz = zpos;
  }

  // set the center of volume variable now
  center[0] = covx; 
  center[1] = covy; 
  center[2] = covz; 
  vec_scale(center, 1.0f / icount, center);
 
  // calculate center-of-volume and scale factor
  scalefactor = maxposx - minposx;

  // prevent getting a zero-scaled scene when loading a single atom.
  if (scalefactor == 0.0) {
    scalefactor = 3.0;
  }

  if ((maxposx - minposx) > scalefactor)
    scalefactor = maxposx - minposx;
  if ((maxposy - minposy) > scalefactor)
    scalefactor = maxposy - minposy;
  if ((maxposz - minposz) > scalefactor)
    scalefactor = maxposz - minposz;

  scalefactor = 1.5f / scalefactor;
}