SapFlatField.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. #ifndef _SAPFLATFIELD_H_
  2. #define _SAPFLATFIELD_H_
  3. // SapFlatField.h : header file
  4. //
  5. #include "SapClassBasicDef.h"
  6. #include "SapColorConversion.h"
  7. // Default ratios
  8. const float SapDefFlatFieldPixelRatio =99.00f; // 99 percent of all pixels
  9. const float SapDefFlatFieldDefectRatio = 1.00f; // Up to 1 percent of defective pixels
  10. const float SapDefFlatFieldAvgFactorBlack = 0.25f; // 0.25 * maximum pixel value
  11. const float SapDefFlatFieldAvgFactorWhite = 0.80f; // 0.80 * maximum pixel value
  12. const float SapDefFlatFieldDeviationMax = 0.25f; // 0.25 * maximum pixel value
  13. // Forward declarations
  14. class SAPCLASSBASIC_CLASS SapFlatFieldStats;
  15. class SAPCLASSBASIC_CLASS SapFlatFieldDefects;
  16. class SapFlatFieldDevice;
  17. class SapFlatFieldDefectivePixelMap;
  18. struct SapFlatFieldRoi
  19. {
  20. int m_LeftOffsetROI;
  21. int m_TopOffsetROI;
  22. int m_WidthROI;
  23. int m_HeightROI;
  24. };
  25. //
  26. // SapFlatField class declaration
  27. //
  28. class SAPCLASSBASIC_CLASS SapFlatField : public SapManager
  29. {
  30. public:
  31. // Various constants
  32. enum MiscValues
  33. {
  34. DefNumLinesAverage = 128,
  35. DefNumFramesAverage = 10,
  36. DefGainMin = 0,
  37. DefGainMax = 255,
  38. DefGainDivisor= 128,
  39. DefGainBase = 0,
  40. DefOffsetMin= 0,
  41. DefOffsetMax= 255,
  42. DefOffsetSoftwareMax= 4095,
  43. DefOffsetFactor= 1,
  44. DefDeviationFactorMax = 4,
  45. InvalidFlatFieldNumber= -1
  46. };
  47. enum CorrectionType
  48. {
  49. CorrectionTypeField,
  50. CorrectionTypeLine,
  51. CorrectionTypeInvalid= -1
  52. };
  53. public:
  54. // Constructor/Destructor
  55. SapFlatField();
  56. SapFlatField(SapAcquisition *pAcq, int numFlatField = 1);
  57. SapFlatField(SapAcqDevice *pAcqDevice);
  58. SapFlatField(SapBuffer *pBuffer, int numFlatField = 1);
  59. SapFlatField(const SapFlatField &flatField);
  60. virtual ~SapFlatField();
  61. SapFlatField &operator= (const SapFlatField &flatField);
  62. // Creation/destruction
  63. virtual BOOL Create();
  64. virtual BOOL Destroy();
  65. public:
  66. // Access to implementation
  67. SapAcquisition *GetAcquisition() const { return m_pAcq; }
  68. SapAcqDevice *GetAcqDevice() const { return m_pAcqDevice; }
  69. SapBuffer *GetBuffer() const { return m_pBuffer; }
  70. SapBuffer *GetBufferOffset() const { return m_pBufferOffset; }
  71. SapBuffer *GetBufferGain() const { return m_pBufferGain; }
  72. BOOL GetBufferOffset(SapBuffer *pBuffer, int bufIndex = 0, int offsetIndex = 0);
  73. BOOL GetBufferGain(SapBuffer *pBuffer, int bufIndex = 0, int gainIndex = 0);
  74. BOOL IsEnabled() const { return m_IsEnabled; }
  75. BOOL IsPixelReplacement() const { return m_bPixelReplacement;}
  76. BOOL IsClippedGainOffsetDefects() const { return m_ClippedGainOffsetDefects; }
  77. BOOL IsSoftware() const { return !m_IsHardware || !m_IsHardwareEnabled; }
  78. CorrectionType GetCorrectionType() const { return m_CorrectionType; }
  79. int GetDeviationMaxBlack() const { return m_DeviationMaxBlack;}
  80. float GetBlackPixelPercentage() const { return m_wantedBlackPixelPercentage;}
  81. int GetDeviationMaxWhite() const { return m_DeviationMaxWhite;}
  82. int GetGainDivisor() const { return m_GainDivisor; }
  83. int GetGainBase() const { return m_GainBase; }
  84. void GetGainMinMax(int *pGainMin, int *pGainMax);
  85. void GetOffsetMinMax(int *pOffsetMin, int *pOffsetMax);
  86. double GetOffsetFactor() const { return m_OffsetFactor; }
  87. int GetNumLinesAverage() const { return m_NumLinesAverage; }
  88. int GetNumFramesAverage() const { return m_NumFramesAverage; }
  89. int GetVerticalOffset() const { return m_VerticalOffset; }
  90. SapAcquisition::VideoType GetVideoType() const { return m_VideoType; }
  91. int GetNumFlatField() const { return m_NumFlatField; }
  92. int GetIndex() const { return m_Index; }
  93. BOOL SetClusterMap(const char* clusterMapFileName);
  94. int GetClusterMapPixelCount() const;
  95. virtual BOOL SetAcquisition(SapAcquisition *pAcq);
  96. virtual BOOL SetAcqDevice(SapAcqDevice *pAcqDevice);
  97. virtual BOOL SetBlackPixelPercentage(float blackPixelPercent);
  98. virtual BOOL SetBuffer(SapBuffer *pBuffer);
  99. virtual BOOL SetCorrectionType( CorrectionType correctionType);
  100. virtual BOOL SetDeviationMaxBlack( int deviationMax);
  101. virtual BOOL SetDeviationMaxWhite( int deviationMax);
  102. virtual BOOL SetGainDivisor(int gainDivisor);
  103. virtual BOOL SetGainMinMax(int gainMin, int gainMax);
  104. virtual BOOL SetGainBase(int gainBase);
  105. virtual BOOL SetOffsetMinMax(int offsetMin, int offsetMax);
  106. virtual BOOL SetOffsetFactor(double offsetFactor);
  107. virtual BOOL SetNumLinesAverage(int numLinesAverage);
  108. virtual BOOL SetNumFramesAverage(int numFramesAverage);
  109. virtual BOOL SetVerticalOffset( int verticalOffset);
  110. virtual BOOL SetVideoType( SapAcquisition::VideoType videoType, SapColorConversion::Align alignment = SapColorConversion::AlignAll);
  111. virtual BOOL SetNumFlatField( int numFlatField);
  112. virtual BOOL SetRegionOfInterest( int leftOffset, int topOffset, int width, int height);
  113. virtual void ResetRegionOfInterest();
  114. virtual BOOL SetIndex( int index);
  115. virtual void Next() { m_Index++; if (m_Index == m_NumFlatField) m_Index = 0; }
  116. // Load/save gain and offset buffers from/to disk files
  117. virtual BOOL Load( const char *fileName);
  118. virtual BOOL Save( const char *fileName);
  119. // Load gain and offset buffers from buffer objects
  120. virtual BOOL Load( SapBuffer* pBufferGain, SapBuffer* pBufferOffset);
  121. // Clear values for gain and offset buffers
  122. virtual BOOL Clear();
  123. // Read offset and gain coefficients from the acquisition device.
  124. virtual BOOL ReadGainOffsetFromDevice();
  125. // Compute values for gain and offset buffers
  126. // NOTE: the numImages parameter is obsolete. Use SetNumFramesAverage() instead.
  127. virtual BOOL ComputeOffset(SapBuffer *pBuffer, int numImages = 0);
  128. virtual BOOL ComputeGain(SapBuffer *pBuffer, SapFlatFieldDefects *pDefects, BOOL bUseImageMaxValue = TRUE, int numImages = 0);
  129. virtual BOOL ComputeGain(SapBuffer *pBuffer, SapFlatFieldDefects *pDefects, SapData target);
  130. // Execution control
  131. virtual BOOL EnableClippedGainOffsetDefects( BOOL enable= TRUE);
  132. virtual BOOL EnablePixelReplacement( BOOL enable= TRUE);
  133. virtual BOOL Enable(BOOL enable = TRUE, BOOL useHardware= TRUE);
  134. virtual BOOL Execute(SapBuffer *pBuffer);
  135. virtual BOOL Execute(SapBuffer *pBuffer, int bufIndex);
  136. // Buffer statictics
  137. virtual BOOL GetAverage(SapBuffer *pBuffer, SapFlatFieldStats *pStats);
  138. virtual BOOL GetStats(SapBuffer *pBuffer, SapFlatFieldStats *pStats);
  139. static BOOL IsPixelInCalibrationROI(SapBuffer *pBuffer, int pixelIndex, SapFlatFieldRoi roi);
  140. static BOOL IsPixelInCalibrationROI(SapBuffer *pBuffer, int pixelX, int pixelY, SapFlatFieldRoi roi);
  141. // Obsolete methods
  142. BOOL IsHardware() const { return m_IsHardware; }
  143. virtual BOOL Load( const char *gainFile, const char *offsetFile);
  144. virtual BOOL Save( const char *gainFile, const char *offsetFile);
  145. virtual BOOL ComputeGain(SapBuffer *pBuffer, int deviationMax, SapFlatFieldDefects *pDefects, BOOL bUseImageMaxValue = TRUE, int numImages = 0);
  146. virtual BOOL ComputeGain(SapBuffer *pBuffer, int blackDeviationMax, int whiteDeviationMax, SapFlatFieldDefects *pDefects, BOOL bUseImageMaxValue = TRUE, int numImages = 0, SapData *pTarget = NULL);
  147. virtual BOOL GetAverage(SapBuffer *pBuffer, int *pAverage, int *pStdDeviation = NULL, int iComponent= 0);
  148. protected:
  149. // Utility methods
  150. virtual BOOL CreateRemaining();
  151. virtual void Construct(SapAcquisition *pAcq, SapAcqDevice *pAcqDevice, SapBuffer *pBuffer, int numFlatField);
  152. virtual BOOL IsFileCompatible(const char *filename, SapBuffer *pBuffer) const;
  153. virtual BOOL IsBufferCompatible( SapBuffer *pBufferSrc, SapBuffer *pBufferDst) const;
  154. virtual BOOL IsFormatCompatible(SapFormat format) const;
  155. virtual BOOL GetPixelDepth( int* pixelDepth) const;
  156. template<class DATATYPE>
  157. BOOL FFCAverageFrames(SapBuffer *pBuffer, int numImages, SapBuffer *pBufferAverage, BOOL bBlackImage = FALSE);
  158. template<class DATATYPE>
  159. BOOL FFCAverageLines(void *pBuffer, int verticalOffset, int width, int height, SapFormat format, void *pBufferAverage, BOOL bBlackImage = FALSE);
  160. template<class BUFTYPE, class OFFSETTYPE>
  161. BOOL FFCComputeOffset(SapBuffer *pAvgBuffer);
  162. template<class BUFTYPE, class FFCTYPE>
  163. BOOL FFCComputeGain(SapBuffer *pBuffer, SapBuffer *pBufferOffset, float pixelRatio, int offsetDeviationMax, int whiteDeviationMax, SapBuffer *pBufferGain, SapFlatFieldDefects *pDefects, int iLineOffset= 0, int iLineStep= 1, int iColumnOffset= 0, int iColumnStep= 1, int bitDepth = -1, int target = -1);
  164. template<class DATATYPE>
  165. BOOL FFCGetAverage(SapBuffer *pBuffer, int *pAverage, int *pStdDeviation, int iLineOffset= 0, int iLineStep= 1, int iColumnOffset= 0, int iColumnStep= 1);
  166. template<class BUFTYPE, class OFFSETTYPE>
  167. BOOL FFCGetStats(SapBuffer *pBuffer, SapBuffer *pBufferOffset, float pixelRatio, SapFlatFieldStats *pStats, int iLineOffset= 0, int iLineStep= 1, int iColumnOffset= 0, int iColumnStep= 1, int iComponent= 0);
  168. template<class BUFTYPE, class OFFSETTYPE>
  169. BOOL FFCGetHistogram(SapBuffer *pBuffer, SapBuffer* pBufferOffset, int **ppHistogram, int *pNumBins, int iLineOffset= 0, int iLineStep= 1, int iColumnOffset= 0, int iColumnStep= 1, double offsetFactor = DefOffsetFactor);
  170. virtual BOOL FFCHistPeaks( int* pHistogram, int numBins, int vicinity, SapDataPoint** ppPeaks, int *pnPeaks);
  171. template<class BUFTYPE, class FFCTYPE>
  172. BOOL FFCExecute(BUFTYPE *pBuffer, int width, int height, SapFormat format, FFCTYPE *pBufferOffset, FFCTYPE *pBufferGain, int isLineScan);
  173. template<class BUFTYPE, class FFCTYPE>
  174. BOOL FFCExecuteAoI(BUFTYPE *pBuffer, int width, int height, int leftOffset, int topOffset, SapFormat format, FFCTYPE *pBufferOffset, FFCTYPE *pBufferGain, int coefWidth, int coefHeight, int isLineScan);
  175. BOOL FFCGetComponentTarget(int iComponent, SapDataRGB *pRgbTarget, SapColorConversion::Align colorAlignment, int *pComponentTarget);
  176. protected:
  177. SapAcquisition *m_pAcq;
  178. SapAcqDevice *m_pAcqDevice;
  179. SapBuffer *m_pBuffer;
  180. SapBuffer *m_pBufferOffset;
  181. SapBuffer *m_pBufferGain;
  182. SapFlatFieldDevice *m_pDevice;
  183. SapFlatFieldDefectivePixelMap *m_pDefectiveMap;
  184. BOOL m_IsEnabled;
  185. BOOL m_IsHardware;
  186. BOOL m_IsHardwareEnabled;
  187. int m_GainDivisor;
  188. int m_GainMin;
  189. int m_GainMax;
  190. int m_GainBase;
  191. int m_OffsetMin;
  192. int m_OffsetMax;
  193. double m_OffsetFactor;
  194. int m_NumLinesAverage;
  195. int m_NumFramesAverage;
  196. int m_VerticalOffset;
  197. int m_DeviationMaxBlack;
  198. int m_DeviationMaxWhite;
  199. BOOL m_bPixelReplacement;
  200. int m_NumFlatField;
  201. int m_Index;
  202. BOOL m_ClippedGainOffsetDefects;
  203. float m_wantedBlackPixelPercentage;
  204. // For Software FFC when ROI is used
  205. SapFlatFieldRoi m_Roi;
  206. SapAcquisition::VideoType m_VideoType;
  207. CorrectionType m_CorrectionType;
  208. SapXferParams m_XferParams;
  209. SapColorConversion::Align m_ColorAlignment;
  210. BOOL m_NeedCoefficientsReload;
  211. };
  212. //
  213. // SapFlatFieldDefects class declaration
  214. //
  215. class SAPCLASSBASIC_CLASS SapFlatFieldDefects
  216. {
  217. public:
  218. SapFlatFieldDefects()
  219. {
  220. m_NumDefects = 0;
  221. m_NumClusters = 0;
  222. m_DefectRatio = 0.0f;
  223. }
  224. ~SapFlatFieldDefects() {}
  225. int GetNumDefects() const { return m_NumDefects; }
  226. int GetNumClusters() const { return m_NumClusters; }
  227. float GetDefectRatio() const { return m_DefectRatio; }
  228. void SetNumDefects(int numDefects) { m_NumDefects = numDefects; }
  229. void SetNumClusters(int numClusters) { m_NumClusters = numClusters; }
  230. void SetDefectRatio(float defectRatio) { m_DefectRatio = defectRatio; }
  231. void IncrementNumDefects() { m_NumDefects++; }
  232. void IncrementNumClusters() { m_NumClusters++; }
  233. protected:
  234. int m_NumDefects;
  235. int m_NumClusters;
  236. float m_DefectRatio;
  237. };
  238. //
  239. // SapFlatFieldStats class declaration
  240. //
  241. class SAPCLASSBASIC_CLASS SapFlatFieldStats
  242. {
  243. public:
  244. enum MiscValues
  245. {
  246. MaxComponent= 4
  247. };
  248. SapFlatFieldStats()
  249. {
  250. m_NumComponents= 1;
  251. memset( m_Average, 0, sizeof( m_Average));
  252. memset( m_StdDeviation, 0, sizeof( m_StdDeviation));
  253. memset( m_PeakPosition, 0, sizeof( m_PeakPosition));
  254. memset( m_Low, 0, sizeof( m_Low));
  255. memset( m_High, 0, sizeof( m_High));
  256. memset( m_NumPixels, 0, sizeof( m_NumPixels));
  257. memset( m_PixelRatio, 0, sizeof( m_PixelRatio));
  258. }
  259. ~SapFlatFieldStats() {}
  260. int GetAverage( int iComponent= 0) const { return m_Average[ iComponent]; }
  261. int GetStdDeviation( int iComponent= 0) const { return m_StdDeviation[ iComponent]; }
  262. int GetPeakPosition( int iComponent= 0) const { return m_PeakPosition[ iComponent]; }
  263. int GetLow( int iComponent= 0) const { return m_Low[ iComponent]; }
  264. int GetHigh( int iComponent= 0) const { return m_High[ iComponent]; }
  265. int GetNumPixels( int iComponent= 0) const { return m_NumPixels[ iComponent]; }
  266. float GetPixelRatio( int iComponent= 0) const { return m_PixelRatio[ iComponent]; }
  267. int GetNumComponents() const { return m_NumComponents;}
  268. void SetAverage(int iComponent, int average) { m_Average[iComponent] = average; }
  269. void SetStdDeviation(int iComponent, int stdDeviation) { m_StdDeviation[iComponent] = stdDeviation; }
  270. void SetPeakPosition(int iComponent, int peakPosition) { m_PeakPosition[iComponent] = peakPosition; }
  271. void SetLow(int iComponent, int low) { m_Low[iComponent] = low; }
  272. void SetHigh(int iComponent, int high) { m_High[iComponent] = high; }
  273. void SetNumPixels(int iComponent, int numPixels) { m_NumPixels[iComponent] = numPixels; }
  274. void SetPixelRatio(int iComponent, float pixelRatio) { m_PixelRatio[iComponent] = pixelRatio; }
  275. void SetNumComponents(int numComponents) { m_NumComponents = numComponents; }
  276. void DecrementLow(int iComponent) { m_Low[iComponent]--; }
  277. void IncrementHigh(int iComponent) { m_High[iComponent]++; }
  278. protected:
  279. int m_NumComponents;
  280. int m_Average[ MaxComponent];
  281. int m_StdDeviation[ MaxComponent];
  282. int m_PeakPosition[ MaxComponent];
  283. int m_Low[ MaxComponent];
  284. int m_High[ MaxComponent];
  285. int m_NumPixels[ MaxComponent];
  286. float m_PixelRatio[ MaxComponent];
  287. };
  288. class SapFlatFieldDevice : public SapManager
  289. {
  290. public:
  291. virtual BOOL Create() = 0;
  292. virtual BOOL Destroy() = 0;
  293. virtual BOOL IsEnabled() = 0;
  294. virtual BOOL IsHwFlatFieldSupported() = 0;
  295. virtual BOOL GetCorrectionType(SapFlatField::CorrectionType *pCorrectionType) = 0;
  296. virtual BOOL GetVideoType(SapAcquisition::VideoType *pVideoType) = 0;
  297. virtual BOOL GetColorAlignment(SapColorConversion::Align *pAlignment) = 0;
  298. virtual BOOL GetFlatFieldBufferParams(int *pWidth, int *pHeight, SapFormat *pFormat) = 0;
  299. virtual BOOL GetAlgorithmParams(int *pGainMin, int *pGainMax, int *pGainDivisor, int *pGainBase, int *pOffsetMin, int *pOffsetMax, double *pOffsetFactor) = 0;
  300. virtual BOOL GetAOI(int *pLeft, int *pWidth, int *pTop, int *pHeight) = 0;
  301. virtual SapXferParams GetXferParams() = 0;
  302. virtual BOOL Enable(BOOL enable) = 0;
  303. virtual BOOL SetNumFlatField(int numFlatField) {m_NumFlatField = numFlatField; return TRUE;};
  304. virtual BOOL ReadGainOffset(SapBuffer *pGainBuffer, SapBuffer *pOffsetBuffer) = 0;
  305. virtual BOOL WriteGainOffset(SapBuffer *pGainBuffer, SapBuffer *pOffsetBuffer) = 0;
  306. virtual BOOL PostComputeGain(SapBuffer *pGainBuffer, SapBuffer *pOffsetBuffer, SapFlatFieldRoi roi) = 0;
  307. protected:
  308. BOOL m_bInitOK;
  309. int m_NumFlatField;
  310. };
  311. class SapFlatFieldAcq : public SapFlatFieldDevice
  312. {
  313. public:
  314. SapFlatFieldAcq(SapAcquisition* pAcq, int numFlatField);
  315. BOOL Create();
  316. BOOL Destroy();
  317. BOOL IsEnabled();
  318. BOOL IsHwFlatFieldSupported();
  319. BOOL GetCorrectionType(SapFlatField::CorrectionType *pCorrectionType);
  320. BOOL GetVideoType(SapAcquisition::VideoType *pVideoType);
  321. BOOL GetColorAlignment(SapColorConversion::Align *pAlignment);
  322. BOOL GetFlatFieldBufferParams(int *pWidth, int *pHeight, SapFormat *pFormat);
  323. BOOL GetAlgorithmParams(int *pGainMin, int *pGainMax, int *pGainDivisor, int *pGainBase, int *pOffsetMin, int *pOffsetMax, double *pOffsetFactor);
  324. BOOL GetAOI(int *pLeft, int *pWidth, int *pTop, int *pHeight);
  325. SapXferParams GetXferParams() {return m_pAcq->GetXferParams();}
  326. BOOL Enable(BOOL enable);
  327. BOOL ReadGainOffset(SapBuffer *pGainBuffer, SapBuffer *pOffsetBuffer);
  328. BOOL WriteGainOffset(SapBuffer *pGainBuffer, SapBuffer *pOffsetBuffer);
  329. BOOL PostComputeGain(SapBuffer *pGainBuffer, SapBuffer *pOffsetBuffer, SapFlatFieldRoi roi) {return TRUE;}
  330. protected:
  331. enum MiscValues
  332. {
  333. InvalidFlatFieldNumber = -1,
  334. };
  335. SapAcquisition *m_pAcq;
  336. int *m_FlatFieldNumbers; // Flat-field numbers returned from acquisition device
  337. };
  338. class SapFlatFieldGenie : public SapFlatFieldDevice
  339. {
  340. public:
  341. SapFlatFieldGenie(SapAcqDevice*);
  342. BOOL Create();
  343. BOOL Destroy();
  344. BOOL IsEnabled();
  345. BOOL IsHwFlatFieldSupported();
  346. BOOL GetCorrectionType(SapFlatField::CorrectionType *pCorrectionType);
  347. BOOL GetVideoType(SapAcquisition::VideoType *pVideoType);
  348. BOOL GetColorAlignment(SapColorConversion::Align *pAlignment);
  349. BOOL GetFlatFieldBufferParams(int *pWidth, int *pHeight, SapFormat *pFormat);
  350. BOOL GetAlgorithmParams(int *pGainMin, int *pGainMax, int *pGainDivisor, int *pGainBase, int *pOffsetMin, int *pOffsetMax, double *pOffsetFactor);
  351. BOOL GetAOI(int *pLeft, int *pWidth, int *pTop, int *pHeight);
  352. SapXferParams GetXferParams() {return m_pAcqDevice->GetXferParams();}
  353. BOOL Enable(BOOL enable);
  354. BOOL ReadGainOffset(SapBuffer *pGainBuffer, SapBuffer *pOffsetBuffer);
  355. BOOL WriteGainOffset(SapBuffer *pGainBuffer, SapBuffer *pOffsetBuffer);
  356. BOOL PostComputeGain(SapBuffer *pGainBuffer, SapBuffer *pOffsetBuffer, SapFlatFieldRoi roi) {return TRUE;}
  357. protected:
  358. BOOL FFCSetReplacementInOffset(SapBuffer *pBufferOffset, SapBuffer* pBufferGain);
  359. BOOL ConvertBuffer(SapBuffer* pSrcBuffer, SapBuffer *pDestBuffer);
  360. protected:
  361. SapAcqDevice *m_pAcqDevice;
  362. SapFormat m_AcqDeviceFlatFieldFormat;
  363. BOOL m_IsFlatFieldEnableFeatureWritable;
  364. static const char *m_ScanTypeFeatureName;
  365. static const char *m_ColorTypeFeatureName;
  366. static const char *m_FlatFieldEnableFeatureName;
  367. static const char *m_FlatFieldWidthFeatureName;
  368. static const char *m_FlatFieldHeightFeatureName;
  369. static const char *m_FlatFieldFormatFeatureName;
  370. static const char *m_FlatFieldGainMinFeatureName;
  371. static const char *m_FlatFieldGainMaxFeatureName;
  372. static const char *m_FlatFieldOffsetMinFeatureName;
  373. static const char *m_FlatFieldOffsetMaxFeatureName;
  374. static const char *m_FlatFieldGainBufferFeatureName;
  375. static const char *m_FlatFieldOffsetBufferFeatureName;
  376. };
  377. class SapFlatFieldDFNC : public SapFlatFieldDevice
  378. {
  379. public:
  380. SapFlatFieldDFNC(SapAcqDevice*);
  381. BOOL Create();
  382. BOOL Destroy();
  383. BOOL IsEnabled();
  384. BOOL IsHwFlatFieldSupported();
  385. BOOL GetCorrectionType(SapFlatField::CorrectionType *pCorrectionType);
  386. BOOL GetVideoType(SapAcquisition::VideoType *pVideoType);
  387. BOOL GetColorAlignment(SapColorConversion::Align *pAlignment);
  388. BOOL GetFlatFieldBufferParams(int *pWidth, int *pHeight, SapFormat *pFormat);
  389. BOOL GetAlgorithmParams(int *pGainMin, int *pGainMax, int *pGainDivisor, int *pGainBase, int *pOffsetMin, int *pOffsetMax, double *pOffsetFactor);
  390. BOOL GetAOI(int *pLeft, int *pWidth, int *pTop, int *pHeight);
  391. SapXferParams GetXferParams() {return m_pAcqDevice->GetXferParams();}
  392. BOOL Enable(BOOL enable);
  393. BOOL ReadGainOffset(SapBuffer *pGainBuffer, SapBuffer *pOffsetBuffer);
  394. BOOL WriteGainOffset(SapBuffer *pGainBuffer, SapBuffer *pOffsetBuffer);
  395. BOOL PostComputeGain(SapBuffer *pGainBuffer, SapBuffer *pOffsetBuffer, SapFlatFieldRoi roi);
  396. protected:
  397. BOOL FFCSetReplacementInOffset(SapBuffer *pBufferOffset, SapBuffer *pBufferGain, SapFlatFieldRoi roi);
  398. protected:
  399. SapAcqDevice *m_pAcqDevice;
  400. static const char *m_ScanTypeFeatureName;
  401. static const char *m_ColorTypeFeatureName;
  402. static const char *m_PixelColorFilterFeatureName;
  403. static const char *m_FlatFieldModeFeatureName;
  404. static const char *m_FlatFieldCalMethodFeatureName;
  405. static const char *m_FlatFieldWidthFeatureName;
  406. static const char *m_FlatFieldHeightFeatureName;
  407. static const char *m_FlatFieldFormatFeatureName;
  408. static const char *m_FlatFieldGainMinFeatureName;
  409. static const char *m_FlatFieldGainMaxFeatureName;
  410. static const char *m_FlatFieldGainDivisorFeatureName;
  411. static const char *m_FlatFieldGainBaseFeatureName;
  412. static const char *m_FlatFieldOffsetMinFeatureName;
  413. static const char *m_FlatFieldOffsetMaxFeatureName;
  414. static const char *m_FlatFieldOffsetFactorFeatureName;
  415. static const char *m_FlatFieldGainBufferFeatureName;
  416. static const char *m_FlatFieldOffsetBufferFeatureName;
  417. };
  418. #pragma region SapDefectivePixelMap
  419. #pragma warning( push )
  420. #pragma warning( disable : 4995 )
  421. #include <vector>
  422. #include <algorithm>
  423. #include <fstream>
  424. #include <sstream>
  425. #include <string>
  426. class SapFlatFieldDefectivePixelMap
  427. {
  428. public:
  429. typedef std::pair<unsigned int, unsigned int> ENTRY;
  430. typedef std::vector<ENTRY> MAP;
  431. /// <summary>
  432. /// Process the .csv file and read indexes and offsets.
  433. /// </summary>
  434. /// <param name="file">path to the file</param>
  435. bool ReadFile(const char* file);
  436. /// <summary>
  437. /// Add/Remove a defective pixel to/from the map.
  438. /// </summary>
  439. /// <param name="line">the line index of the pixel</param>
  440. /// <param name="column">the column index of the pixel</param>
  441. /// <param name="defective">true if defective, otherwise false</param>
  442. void SetDefectivePixel(unsigned int line, unsigned int column, bool defective);
  443. /// <summary>
  444. /// Get defective state of a pixel.
  445. /// </summary>
  446. /// <param name="line">the line index of the pixel</param>
  447. /// <param name="column">the column index of the pixel</param>
  448. /// <returns>true if defective, otherwise false</returns>
  449. bool IsPixelDefective(unsigned int line, unsigned int column) const;
  450. /// <summary>
  451. /// Does the given line include any registred defective pixel?
  452. /// Use this in application code to speed up throughput.
  453. /// </summary>
  454. /// <param name="line">index of the line to check</param>
  455. /// <returns>true if line contains defective pixels, otherwise false</returns>
  456. bool LineContainsDefectivePixels(unsigned int line) const;
  457. /// <summary>
  458. /// Get the count of defective pixels in the map.
  459. /// </summary>
  460. /// <returns>count of defective pixels</returns>
  461. unsigned int Count() const;
  462. private:
  463. // store the coordinates of the defective pixels
  464. MAP _map;
  465. };
  466. #pragma warning( pop )
  467. #pragma endregion
  468. #endif