void main() { printf("\n Input data file name: "); scanf("%s", filename); fp = fopen(filename, "r"); //read size of linear system fscanf(fp,"%d", &m); fscanf(fp,"%d", &n); //allocate memory vmblock = vminit(); A = (REAL **) vmalloc(vmblock, MATRIX, m+1, n+1); U = (REAL **) vmalloc(vmblock, MATRIX, m+1, n+1); V = (REAL **) vmalloc(vmblock, MATRIX, n+1, n+1); B = (REAL *) vmalloc(vmblock, VEKTOR, m+1, 0); W = (REAL *) vmalloc(vmblock, VEKTOR, n+1, 0); X = (REAL *) vmalloc(vmblock, VEKTOR, n+1, 0); // read matrix A for (i=1; i<=m; i++) for (j=1; j<=n; j++) fscanf(fp,"%lf", &A[i][j]); // read vector B for (i=1; i<=m; i++) fscanf(fp,"%lf", &B[i]); fclose(fp); fp = fopen("tsvbksb.lst", "w"); fprintf(fp,"\n M = %d\n", m); fprintf(fp," N = %d\n", n); WriteMat(" Matrix A:",A,m,n); WriteVec(" Vector B:",B,m); // Save A in U for (i=1; i<=m; i++) for (j=1; j<=n; j++) U[i][j]=A[i][j]; //call singular value decomposition subroutine SVDCMP(U,m,n,W,V); WriteMat(" Matrix U:",U,m,n); WriteVec(" Vector W:",W,n); WriteMat(" Matrix V:",V,m,n); //seek highest value of W's and set near-zero //values to exactly zero (for near-singular cases) WMAX=0.0; for (j=1; j<=n; j++) if (W[j] > WMAX) WMAX=W[j]; WMIN=WMAX*1e-6; for (j=1; j<=n; j++) if (W[j] < WMIN) W[j]=0.0; //call solver for SVD matrix SVBKSB(U,W,V,m,n,B,X); //print solution WriteVec(" Solution:",X,n); // free memory vmfree(vmblock); fclose(fp); printf("\n Results in file tsvbksb.lst.\n\n"); }
Waifu2x::eWaifu2xError Waifu2x::waifu2x(const boost::filesystem::path &input_file, const boost::filesystem::path &output_file, const waifu2xCancelFunc cancel_func) { Waifu2x::eWaifu2xError ret; if (!is_inited) return eWaifu2xError_NotInitialized; const boost::filesystem::path ip(input_file); const boost::filesystem::path ipext(ip.extension()); const bool isJpeg = boost::iequals(ipext.string(), ".jpg") || boost::iequals(ipext.string(), ".jpeg"); const bool isReconstructNoise = mode == "noise" || mode == "noise_scale" || (mode == "auto_scale" && isJpeg); const bool isReconstructScale = mode == "scale" || mode == "noise_scale" || mode == "auto_scale"; cv::Mat float_image; ret = LoadMat(float_image, input_file); if (ret != eWaifu2xError_OK) return ret; cv::Mat reconstruct_image; ret = Reconstruct(isReconstructNoise, isReconstructScale, cancel_func, float_image, reconstruct_image); if (ret != eWaifu2xError_OK) return ret; cv::Mat process_image; ret = AfterReconstructFloatMatProcess(isReconstructScale, cancel_func, float_image, reconstruct_image, process_image); if (ret != eWaifu2xError_OK) return ret; float_image.release(); const int cv_depth = DepthBitToCVDepth(output_depth); const double max_val = GetValumeMaxFromCVDepth(cv_depth); const double eps = GetEPS(cv_depth); cv::Mat write_iamge; if (output_depth != 32) // 出力がfloat形式なら変換しない process_image.convertTo(write_iamge, cv_depth, max_val, eps); else write_iamge = process_image; process_image.release(); // 完全透明のピクセルの色を消す(処理の都合上、完全透明のピクセルにも色を付けたから) // モデルによっては画像全域の完全透明の場所にごく小さい値のアルファが広がることがある。それを消すためにcv_depthへ変換してからこの処理を行うことにした // (ただしcv_depthが32の場合だと意味は無いが) if (write_iamge.channels() > 3) { std::vector<cv::Mat> planes; cv::split(write_iamge, planes); cv::Mat mask; cv::threshold(planes[3], mask, 0.0, 1.0, cv::THRESH_BINARY); // アルファチャンネルを二値化してマスクとして扱う // アルファチャンネルが0のところの色を消す planes[0] = planes[0].mul(mask); planes[1] = planes[1].mul(mask); planes[2] = planes[2].mul(mask); cv::merge(planes, write_iamge); } ret = WriteMat(write_iamge, output_file); if (ret != eWaifu2xError_OK) return ret; write_iamge.release(); return eWaifu2xError_OK; }
int main(int argc, char** argv) { if (argc < 2) { doHelp(argv[0]); return 0; } plDebug::Init(plDebug::kDLAll); const char* filename = argv[1]; plString outfile = filenameConvert(filename, ".obj"); plString mtlfile = filenameConvert(filename, ".mtl"); hsTArray<plString> objects; for (int i=2; i<argc; i++) { if (argv[i][0] == '-') { if (strcmp(argv[i], "-o") == 0) { if (i+1 >= argc) { printf("No output filename supplied\n"); return 0; } else { outfile = argv[++i]; } } else if (strcmp(argv[i], "-m") == 0) { if (i+1 >= argc) { printf("No material filename supplied\n"); return 0; } else { mtlfile = argv[++i]; } } else if (strcmp(argv[i], "--help") == 0) { doHelp(argv[0]); return 0; } else { printf("Unrecognized option: %s\n", argv[i]); } } else { objects.append(argv[i]); } } plResManager rm; plPageInfo* page; try { page = rm.ReadPage(filename); } catch (const hsException& e) { plDebug::Error("%s:%lu: %s", e.File(), e.Line(), e.what()); return 1; } catch (const std::exception& e) { plDebug::Error("%s", e.what()); return 1; } catch (...) { plDebug::Error("Undefined error!"); return 1; } hsFileStream OS; if (!OS.open(mtlfile, fmCreate)) { fprintf(stderr, "Error opening %s for writing!\n", mtlfile.cstr()); return 1; } OS.writeStr("#Generated by Prp2Obj\n"); try { std::vector<plKey> MObjs = rm.getKeys(page->getLocation(), kGMaterial); for (size_t i = 0; i < MObjs.size(); i++) { hsGMaterial* mat = hsGMaterial::Convert(rm.getObject(MObjs[i])); WriteMat(mat, &OS); } } catch (const hsException& e) { plDebug::Error("%s:%lu: %s", e.File(), e.Line(), e.what()); return 1; } OS.close(); if (!OS.open(outfile, fmCreate)) { fprintf(stderr, "Error opening %s for writing!\n", outfile.cstr()); return 1; } OS.writeStr("#Generated by Prp2Obj\n"); OS.writeStr(plString::Format("mtllib %s\n", mtlfile.cstr())); size_t nObjects = 0; try { std::vector<plKey> SObjs = rm.getKeys(page->getLocation(), kSceneObject); for (size_t i = 0; i < SObjs.size(); i++) { if (objects.empty() || objects.find(SObjs[i]->getName()) != (size_t)-1) { plSceneObject* obj = plSceneObject::Convert(rm.getObject(SObjs[i])); if (obj->getDrawInterface().Exists()) WriteObj(obj, &OS, objects.empty()); nObjects++; } } } catch (const hsException& e) { plDebug::Error("%s:%lu: %s", e.File(), e.Line(), e.what()); return 1; } OS.close(); printf("Successfully wrote %u objects\n", (unsigned int)nObjects); return 0; }