www.pudn.com > DalsaNetlink.rar > ColorAdjustmentDialog.cpp
// ColorAdjustmentDialog.cpp : implementation file // #include "stdafx.h" #include "CyApp.h" #include "ColorAdjustmentDialog.h" #include "CyAcquisitionPage.h" #include#include #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // ColorAdjustmentDialog dialog ColorAdjustmentDialog::ColorAdjustmentDialog( CWnd* pParent, CyAcquisitionPage& aOwner, CyRGBFilter& aFilter, CyImageBuffer& aBuffer, unsigned long aFlags ) : CDialog(ColorAdjustmentDialog::IDD, pParent) , mFilter( aFilter ) , mOwner( aOwner ) , mBuffer( aBuffer ) , mFlags( aFlags ) { //{{AFX_DATA_INIT(ColorAdjustmentDialog) mBlueGain = 0.0; mBlueOffset = 0; mGreenGain = 0.0; mGreenOffset = 0; mRedGain = 0.0; mRedOffset = 0; //}}AFX_DATA_INIT // Get the offset from index 0's value mRedOffset = aFilter.GetRedValue16( 0 ); mGreenOffset = aFilter.GetGreenValue16( 0 ); mBlueOffset = aFilter.GetBlueValue16( 0 ); // get the gains from the filter mRedGain = static_cast ( aFilter.GetRedValue16( 255 ) ); mRedGain = ( mRedGain - static_cast ( mRedOffset ) ) / 255.0; mGreenGain = static_cast ( aFilter.GetGreenValue16( 255 ) ); mGreenGain = ( mGreenGain - static_cast ( mGreenOffset ) ) / 255.0; mBlueGain = static_cast ( aFilter.GetBlueValue16( 255 ) ); mBlueGain = ( mBlueGain - static_cast ( mBlueOffset ) ) / 255.0; // set the WG gains to 1.0f mWBRedGain = 1.0; mWBGreenGain = 1.0; mWBBlueGain = 1.0; } void ColorAdjustmentDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(ColorAdjustmentDialog) DDX_Control(pDX, IDC_COLOR_ADJUST_WB_RESULT, mWBResultControl); DDX_Text(pDX, IDC_BLUE_GAIN, mBlueGain); DDV_MinMaxDouble(pDX, mBlueGain, 1.e-004, 1000000.); DDX_Text(pDX, IDC_BLUE_OFFSET, mBlueOffset); DDV_MinMaxUInt(pDX, mBlueOffset, 0, 65535); DDX_Text(pDX, IDC_GREEN_GAIN, mGreenGain); DDV_MinMaxDouble(pDX, mGreenGain, 1.e-004, 1000000.); DDX_Text(pDX, IDC_GREEN_OFFSET, mGreenOffset); DDV_MinMaxUInt(pDX, mGreenOffset, 0, 65535); DDX_Text(pDX, IDC_RED_GAIN, mRedGain); DDV_MinMaxDouble(pDX, mRedGain, 1.e-004, 1000000.); DDX_Text(pDX, IDC_RED_OFFSET, mRedOffset); DDV_MinMaxUInt(pDX, mRedOffset, 0, 65535); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(ColorAdjustmentDialog, CDialog) //{{AFX_MSG_MAP(ColorAdjustmentDialog) ON_WM_CLOSE() ON_BN_CLICKED(IDC_COLOR_ADJUST_WB_ANALYZE, OnColorAdjustWbAnalyze) ON_BN_CLICKED(IDC_COLOR_ADJUST_WB_APPLY, OnColorAdjustWbApply) ON_BN_CLICKED(IDC_APPLY_GAINS_OFFSETS, OnApplyGainsOffsets) ON_BN_CLICKED(IDC_RESET_GAINS_OFFSETS, OnResetGainsOffsets) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // ColorAdjustmentDialog message handlers void ColorAdjustmentDialog::OnOK() { mOwner.PostMessage( WM_COMMAND, IDC_COLOR_ADJUST_CLOSED ); CDialog::OnOK(); } void ColorAdjustmentDialog::OnCancel() { mOwner.PostMessage( WM_COMMAND, IDC_COLOR_ADJUST_CLOSED ); CDialog::OnCancel(); } void ColorAdjustmentDialog::OnClose() { mOwner.PostMessage( WM_COMMAND, IDC_COLOR_ADJUST_CLOSED ); CDialog::OnClose(); } void ColorAdjustmentDialog::OnColorAdjustWbAnalyze() { unsigned long lQueueSize = mBuffer.GetQueueSize(); if ( lQueueSize < 2 ) mBuffer.SetQueueSize( 2 ); // Grab a frame unsigned char * lPtr; unsigned long lSize; CyBuffer::ReadLockID lID; if ( mBuffer.LockForRead( (void**) &lPtr, &lSize, &lID, CyBuffer::FLAG_NO_WAIT | CyBuffer::FLAG_ERROR_IF_EMPTY ) != CY_RESULT_OK ) { mBuffer.SetQueueSize( lQueueSize ); MessageBox( "Could not obtain frame from source. Acquisition must be in continuous mode." ); return; } // Convert to RGB 24, WITHOUT filtering CyRGB24 lOutputPixel; if ( !lOutputPixel.HasConverterFrom( mBuffer.GetFormat() ) ) { mBuffer.SignalReadEnd( lID ); mBuffer.SetQueueSize( lQueueSize ); MessageBox( "There is no conversion available from the actual pixel type" ); return; } const CyPixelConverter& lConverter = lOutputPixel.GetConverterFrom( mBuffer.GetFormat() ); unsigned char * lBuffer = new unsigned char[ lOutputPixel.GetBufferSizeFor( mBuffer.GetSizeX(), mBuffer.GetSizeY() ) ]; if ( lConverter.Convert( lPtr, mBuffer.GetSizeX(), mBuffer.GetSizeY(), lBuffer, mBuffer.GetSizeX(), mBuffer.GetSizeY(), mBuffer.GetSizeX(), mBuffer.GetSizeY(), mFlags ) != CY_RESULT_OK ) { mBuffer.SignalReadEnd( lID ); mBuffer.SetQueueSize( lQueueSize ); delete [] lBuffer; MessageBox( "Could not convert acquired data to RGB 24-bit" ); return; } mBuffer.SignalReadEnd( lID ); mBuffer.SetQueueSize( lQueueSize ); // Compute the mean value of each channel double lRedSum = 0; double lGreenSum = 0; double lBlueSum = 0; double lCount = 0; lPtr = lBuffer; for ( unsigned long j = 0; j < mBuffer.GetSizeY(); ++j ) { for ( unsigned long i = 0; i < mBuffer.GetSizeX(); i += 4 ) { lRedSum += *lPtr++; lGreenSum += *lPtr++; lBlueSum += *lPtr++; lRedSum += *lPtr++; lGreenSum += *lPtr++; lBlueSum += *lPtr++; lRedSum += *lPtr++; lGreenSum += *lPtr++; lBlueSum += *lPtr++; lRedSum += *lPtr++; lGreenSum += *lPtr++; lBlueSum += *lPtr++; lCount += 4; } } delete [] lBuffer; lRedSum /= lCount; lGreenSum /= lCount; lBlueSum /= lCount; mWBRedGain = lRedSum; mWBGreenGain = lGreenSum; mWBBlueGain = lBlueSum; double lLargest = max( mWBRedGain, max( mWBGreenGain, mWBBlueGain ) ); mWBRedGain = lLargest / mWBRedGain; mWBGreenGain = lLargest / mWBGreenGain; mWBBlueGain = lLargest / mWBBlueGain; // Display the results CString lTemp; lTemp.Format( "Mean RGB value = (%u, %u, %u),\nSuggested RGB gain = (%3.3f, %3.3f, %3.3f)", static_cast ( lRedSum ), static_cast ( lGreenSum ), static_cast ( lBlueSum ), mWBRedGain, mWBGreenGain, mWBBlueGain ); mWBResultControl.SetWindowText( lTemp ); } void ColorAdjustmentDialog::OnColorAdjustWbApply() { mRedGain = mWBRedGain; mGreenGain = mWBGreenGain; mBlueGain = mWBBlueGain; if ( !UpdateData( FALSE ) ) return; OnApplyGainsOffsets(); } void ColorAdjustmentDialog::OnApplyGainsOffsets() { if ( !UpdateData() ) return; mFilter.SetMultipliers( mRedGain, mGreenGain, mBlueGain, mRedOffset, mGreenOffset, mBlueOffset ); } void ColorAdjustmentDialog::OnResetGainsOffsets() { mRedGain = 1.0; mGreenGain = 1.0; mBlueGain = 1.0; mRedOffset = 0; mGreenOffset = 0; mBlueOffset = 0; if ( !UpdateData( FALSE ) ) return; mFilter.SetMultipliers( mRedGain, mGreenGain, mBlueGain, mRedOffset, mGreenOffset, mBlueOffset ); }