非常感謝以下兩個博客:
IPOL上的non-local means源程序的移植過程:
http://blog.csdn.net/tuyang120428941/article/details/7052487
libpng安裝與配置(Win7+VS2010):
http://www.cnblogs.com/lvrcbl/p/3962463.html
本篇文章是我遇到的問題的整合以及使用這兩個博客解決的總結,希望兩位作者能理解我這裏複製了大量的內容。
一、libpng環境
libpng:http://libmng.com/pub/png/libpng.html
zlib:http://www.zlib.net/
IDE:VS2012
將下載的兩個zip解壓到同一目錄下 即放如:c:\libpng c:\zlib
打開ibpng目錄下的projects\vstudio中的工程文件(低版本的VS可以打開projects\visualc71中的工程)。
參考readme,裏面先修改C:\lpng1626\projects\vstudio\zlib.props中的zlib路徑:<ZLibSrcDir>c:\zlib-1.2.8</ZLibSrcDir>
編譯運行,在輸出目錄(Debug或Realse)中得到輸出文件libpng16.dll、libpng16.lib、zlib.lib。
在編譯運行時,有問題時,整個工程先清理一下再試。
二、創建工程
創建一個工程,將之前下載的程序導入這個工程中
右鍵點擊工程名打開Properties(屬性)對話框
在C/C++->General(常規)->Additional Include Directories(附加包含目錄)中添加libpng目錄
在Linker->General(常規)->Additional Library Directories(附加庫目錄)中添加剛剛生成的lib文件所在的路徑
在Linker->Input(輸入)->Additional Dependencies(附加依賴項)中添加libpng16.lib、zlib.lib兩個文件
做好上述工作之後,我們進行編譯,發現報錯:
Cannot open include file: 'unistd.h',一查發現這unistd.h是UNIX下使用的庫函數頭文件,類似於windows下的'windows.h',這裏的話,爲了不讓其報錯,我們可以自己先寫一個unistd.h文件,然後再看會報什麼錯,unistd.h的內容爲:
/** This file is part of the Mingw32 package.
* unistd.h maps (roughly) to io.h
*/
#ifndef _UNISTD_H
#define _UNISTD_H
#include <io.h>
#include <process.h>
#endif /* _UNISTD_H */
|
|
由於我們是在當前目錄中引用這個unistd.h這個頭文件,所以需要將#include <unistd.h>改成#include "unistd.h",然後繼續編譯,繼續報錯:
1. 'M_PI' : undeclared identifier
2. 'rintf': identifier not found
首先我們可以查下M_PI是一個宏,實際上cmath函數裏的,但是無法識別,這個好像是一個C/C+標準函數庫的一個bug,解決方法很簡單,
在libauxiliar.h這個頭文件中加入
#define _USE_MATH_DEFINES
這個宏定義,就OK。
rintf是一個四捨五入函數,在這裏我們可以將
int iLutLength = (int) rintf((float) LUTMAX * (float) LUTPRECISION);
改成
int iLutLength = (int) ((float) LUTMAX * (float) LUTPRECISION+0.5);
效果是一樣的。繼續編譯,然後又報錯,
_main already defined in nlmeans_ipol.obj
這是因爲在這個工程裏面有三個main函數,由於我們這裏只是爲了使用NLM進行去噪,所以img_diff_ipol.cpp和img_mse_ipol.cpp這兩個文件我們可以暫時先從當前工程中刪除掉,
然後再編譯,這時候我出現
提示缺少libpng16.dll,則將剛剛生成的libpng16.dll文件複製到工程目錄(Debug或Realse)中即可。也可以複製到系統目錄Windows\System32(64位操作系統需複製到Windows\SysWOW64)中。
然後就編譯成功了。
現在傳遞一下參數,這裏我的標準差是sigma=30,in.png 圖片放在項目文件夾下,後面兩個參數是處理的噪聲圖和去噪圖的名字
---> in.png 30 noisy.png denoised.png
菜單Project -> Properties -> Configuration Properties -> Debugging
在Command Arguments裏填上即可。
中文版:
菜單[項目] -> 屬性頁 -> 配置屬性 -> 調試
在[命令行參數]裏填上即可。