void SLICSegmentor::Run() { cout<<"====="<<m_Name<<" Runing..."<<endl; SLIC slicsp; int h = m_Img.rows, w = m_Img.cols; uint* imgData = new uint[h*w]; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { cv::Vec3b bgr = m_Img.at<cv::Vec3b>(i, j); imgData[i*w+j] = (bgr[2]<<16) | (bgr[1]<<8) | (bgr[0]); } } int numLabels; int *klabels = new int[h*w]; slicsp.PerformSLICO_ForGivenStepSize(imgData, w, h, klabels, numLabels, m_Step, NULL); for (int i = 0; i < h; i++) { int* ptr = m_Result.ptr<int>(i); for (int j = 0; j < w; j++) { ptr[j] = klabels[i*w+j]; } } delete[] klabels; delete[] imgData; Segmentor::Run(); }
int _tmain(int argc, _TCHAR* argv[]) { #else int main(int argc, char **argv) { #endif if(argc != 2 && argc != 3) { fprintf(stderr, "Usage: sc <img1>\n"); return 1; } int spSize = 5; if(argc == 3) { sscanf(argv[2], "%d", &spSize); } ImageFile imgFile (argv[1]); if(!imgFile.Load()) { fprintf(stderr, "Error loading file: %s\n", argv[1]); return 1; } FasTC::Image<> *img = imgFile.GetImage(); const int kWidth = img->GetWidth(); const int kHeight = img->GetHeight(); const int nPixels = kWidth * kHeight; const uint32 pixelBufSz = nPixels * sizeof(FasTC::Pixel); FasTC::Pixel *pixels = new FasTC::Pixel[pixelBufSz]; memcpy(pixels, img->GetPixels(), pixelBufSz); uint32 *rawPixels = new uint32[kWidth * kHeight]; for(int i = 0; i < nPixels; i++) { // Pixels are stored as little endian ARGB, so we want ABGR pixels[i].Shuffle(0x6C); // 01 10 11 00 rawPixels[i] = pixels[i].Pack(); } int *labels = new int[nPixels]; int numLabels; SLIC slic; slic.PerformSLICO_ForGivenStepSize( rawPixels, kWidth, kHeight, labels, numLabels, spSize, 1.0); std::unordered_map<uint32, Region> regions; CollectPixels(kWidth, kHeight, pixels, labels, regions); std::cout << "Num regions: " << regions.size() << std::endl; for(auto &r : regions) { r.second.Compress(); r.second.Reconstruct(); } for(int i = 0; i < nPixels; i++) { pixels[i] = regions[labels[i]].GetNextPixel(); pixels[i].Shuffle(0x6C); } std::vector<Partition<4, 4> > partitions; EnumerateBPTC(partitions); std::cout << partitions.size() << " 4x4 BPTC partitions" << std::endl; VpTree<Partition<4, 4>, Partition<4, 4>::Distance> vptree; vptree.create(partitions); // Just to test, find the partition close to half 0 half 1.. Partition<4, 4> test; for(uint32 i = 0; i < 16; i++) { if(i < 8) { test[i] = 0; } else { test[i] = 1; } } vector<Partition<4, 4> > closest; vptree.search(test, 1, &closest, NULL); std::cout << closest[0].GetIndex() << std::endl; BPTCC::CompressionSettings settings; settings.m_NumSimulatedAnnealingSteps = 0; settings.m_ShapeSelectionFn = ChosePresegmentedShape<4, 4>; SelectionInfo info(vptree, labels, kWidth, kHeight); settings.m_ShapeSelectionUserData = &info; uint8 *outBuf = new uint8[kWidth * kHeight]; FasTC::CompressionJob cj( FasTC::eCompressionFormat_BPTC, reinterpret_cast<const uint8 *>(pixels), outBuf, static_cast<uint32>(kWidth), static_cast<uint32>(kHeight)); StopWatch sw; sw.Start(); BPTCC::Compress(cj, settings); sw.Stop(); std::cout << "Compression time: " << sw.TimeInMilliseconds() << "ms" << std::endl; CompressedImage ci(kWidth, kHeight, FasTC::eCompressionFormat_BPTC, outBuf); FasTC::Image<> outImg(kWidth, kHeight, pixels); std::cout << "PSNR: " << outImg.ComputePSNR(&ci) << "db" << std::endl; ImageFile outImgFile("out.png", eFileFormat_PNG, outImg); outImgFile.Write(); delete [] labels; delete [] rawPixels; delete [] pixels; return 0; }