//骨架化 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); }
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_; }
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; }