72
Maize Kernel Measurement software V2.0 source code Beijing Research Center for Information Technology in Agriculture

@file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Embed Size (px)

Citation preview

Page 1: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software V2.0source code

Beijing Research Center for Information Technology in Agriculture

Page 2: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 1

#pragma once#include "kernelInterface.h"class kernelSuspendControlDlg;class kernelProjectDlg;class kernelCameraControlDlg;class kernelDetectDlg;class kernelRTImgTipDlg;

class AFX_CLASS_EXPORT CkernelMeasureAppDlg : public CDialogEx{ public:

CkernelMeasureAppDlg(CWnd* pParent = NULL);enum { IDD = IDD_KERNELMEASUREAPP_DIALOG };

protected:virtual void DoDataExchange(CDataExchange* pDX);kernelInterface m_kernelInterface;streamKZSystem m_kernelSystem;kernelSuspendControlDlg * m_kernelSuspendControlDlg;kernelProjectDlg* m_pkernelProjectDlg;kernelCameraControlDlg * m_pkernelCameraControlDlg;kernelDetectDlg *m_pkernelDetectDlg;kernelRTImgTipDlg *m_pkernelRTImgTipDlg;

protected:HICON m_hIcon; virtual BOOL OnInitDialog();afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()

public:virtual INT_PTR DoModal();virtual BOOL PreTranslateMessage(MSG* pMsg);virtual void Serialize(CArchive& ar);afx_msg void OnDestroy();afx_msg void OnSize(UINT nType, int cx, int cy);afx_msg void OnTimer(UINT_PTR nIDEvent);//afx_msg void OnBnClickedButtonKernelPro();//afx_msg void OnBnClickedButtonKernelDevice();afx_msg void OnBnClickedButtonGo();virtual void OnFinalRelease();

};

#include "stdafx.h"#include "kernelMeasureApp.h"#include "kernelMeasureAppDlg.h"

Page 3: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 2

#include "afxdialogex.h"#include "kernelInterface.h"#include "kernelSuspendControlDlg.h"#include "duCheckRegister.h"#include "CommonParams.h"#include "streamKernelSet.h"

CkernelMeasureAppDlg::CkernelMeasureAppDlg(CWnd* pParent /*=NULL*/): CDialogEx(CkernelMeasureAppDlg::IDD, pParent)

{m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON_KERNEL_APP); m_kernelSuspendControlDlg = NULL;

}

void CkernelMeasureAppDlg::DoDataExchange(CDataExchange* pDX){

CDialogEx::DoDataExchange(pDX);}

BEGIN_MESSAGE_MAP(CkernelMeasureAppDlg, CDialogEx)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_DESTROY()ON_WM_SIZE()ON_WM_TIMER()//ON_BN_CLICKED(IDC_BUTTON_KERNEL_PRO,

&CkernelMeasureAppDlg::OnBnClickedButtonKernelPro)//ON_BN_CLICKED(IDC_BUTTON_KERNEL_DEVICE,

&CkernelMeasureAppDlg::OnBnClickedButtonKernelDevice)ON_BN_CLICKED(IDC_BUTTON_GO, &CkernelMeasureAppDlg::OnBnClickedButtonGo)

END_MESSAGE_MAP()

BOOL CkernelMeasureAppDlg::OnInitDialog(){

CDialogEx::OnInitDialog();CString m_strTips;CString m_strRegisterTime;duCheckRegister check;CORNREGISTERSTRU infoREG;BOOL bRes = check.IsRegistered( infoREG );

if( infoREG.bUseREG ){

if( bRes )

Page 4: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 3

{streamKernelSet sParams;sParams.readini();sParams.m_strUserLabel.Format( _T("%s"),

STRUSERTYPES[infoREG.nUserType] );sParams.writeini();

}else{

return FALSE;}

}

m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON_KERNEL_APP);

SetIcon(m_hIcon, TRUE); // 设置大图标SetIcon(m_hIcon, FALSE); // 设置小图标m_pkernelProjectDlg = new kernelProjectDlg( &m_kernelSystem, this );m_pkernelProjectDlg->ShowWindow( SW_SHOW );m_pkernelCameraControlDlg = new kernelCameraControlDlg( this,

&m_kernelSystemkernelInterface::RegisterWnd( m_pkernelDetectDlg );m_pkernelCameraControlDlg->ShowWindow(SW_SHOW);

if( ! m_kernelSuspendControlDlg ){

m_kernelSuspendControlDlg = new kernelSuspendControlDlg( &m_kernelSystem, this, 1);

m_kernelSuspendControlDlg->m_pkernelProjectDlg = m_pkernelProjectDlg ;

m_kernelSuspendControlDlg->m_pkernelCameraControlDlg= m_pkernelCameraControlDlg;

m_kernelSuspendControlDlg->m_pkernelDetectDlg = m_pkernelDetectDlg ;

m_kernelSuspendControlDlg->m_pkernelRTImgTipDlg = m_pkernelRTImgTipDlg ;

m_kernelSuspendControlDlg->ArragePanels( KERNELPANEL_PRO );}m_kernelSuspendControlDlg->ShowWindow( SW_SHOW );m_kernelSuspendControlDlg->BringWindowToTop();return TRUE;

}

void CkernelMeasureAppDlg::OnPaint(){

Page 5: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 4

if (IsIconic()){

CPaintDC dc(this);SendMessage(WM_ICONERASEBKGND,

reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;dc.DrawIcon(x, y, m_hIcon);

}else{

CDialogEx::OnPaint();}

}

HCURSOR CkernelMeasureAppDlg::OnQueryDragIcon(){

return static_cast<HCURSOR>(m_hIcon);}

INT_PTR CkernelMeasureAppDlg::DoModal(){

return CDialogEx::DoModal();}

BOOL CkernelMeasureAppDlg::PreTranslateMessage(MSG* pMsg){

if( pMsg->message == WM_KEYDOWN ){

if(pMsg->wParam == VK_RETURN|| pMsg->wParam == VK_ESCAPE )

{::TranslateMessage(pMsg);::DispatchMessage(pMsg);return TRUE; // DO NOT process further

}}return CDialogEx::PreTranslateMessage(pMsg);

}

Page 6: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 5

void CkernelMeasureAppDlg::Serialize(CArchive& ar){

if (ar.IsStoring()){ // storing code}else{ // loading code}

}

void CkernelMeasureAppDlg::OnDestroy(){

CDialogEx::OnDestroy();}

void CkernelMeasureAppDlg::OnSize(UINT nType, int cx, int cy){

CDialogEx::OnSize(nType, cx, cy);}

void CkernelMeasureAppDlg::OnTimer(UINT_PTR nIDEvent){

CDialogEx::OnTimer(nIDEvent);}

void CkernelMeasureAppDlg::OnFinalRelease(){

if( m_pkernelProjectDlg ){

delete m_pkernelProjectDlg;m_pkernelProjectDlg = NULL;

}if( m_pkernelCameraControlDlg ){

delete m_pkernelCameraControlDlg;m_pkernelCameraControlDlg = NULL;

}if( m_pkernelDetectDlg ){

delete m_pkernelDetectDlg;m_pkernelDetectDlg = NULL;

}

Page 7: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 6

if( m_pkernelRTImgTipDlg ){

delete m_pkernelRTImgTipDlg;m_pkernelRTImgTipDlg = NULL;

}if( m_kernelSuspendControlDlg ){

delete m_kernelSuspendControlDlg;m_kernelSuspendControlDlg = NULL;

}

CDialogEx::OnFinalRelease();}

#pragma once#include "afx.h"#include "duDHCamera.h"#include "streamKernelSet.h"#include "duKernelCamera_FC.h"#include "streamKernels.h"#include <vector>using namespace std;

class AFX_CLASS_EXPORT kernelInterface :public CObject

{public:

kernelInterface(void);~kernelInterface(void);static /*CStreamParams*/streamKernelSet s_kernel_param;static unsigned int s_nCameraImageHeight;static unsigned int s_nCameraImageWidth ;static streamCamera* s_cameraBase; static BOOL RegisterWnd( CWnd* pDrawWnd ); static duBKcodeBook* s_duBKcodeBook; static CString g_strOneBKKernelImage;static IplImage* s_localObjMaskImage;

static kernelRes s_localBKRes; static std::vector<KernelInfo> s_localBKObjects; static BOOL DrawBKObjectsAndCalculate( IplImage* pSource ); static CCriticalSection m_csData; static BOOL ComputeBKObject(streamKernel& kernel,kernelRes& KRes);static BOOL SplitSingleKernel(

Page 8: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 7

IplImage* pSourceRGB, IplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale,

double & dMaxArea,CvPoint ptOrigin = cvPoint(0,0) );

static BOOL DetermineSingleKernelGeometry(

IplImage* pSourceRGB, // 用于绘图的原始图像CvSeq *contour, // 籽粒的轮廓double &dLen,double &dWid,CvPoint &ptM0, // main axisCvPoint &ptM1,CvPoint &ptS0, // CvPoint &ptS1);

static BOOL PictureWindows(const CString &strPicFile, CString &sError);};

#include "StdAfx.h"#include "kernelInterface.h"#include "duKernelCamera.h"#include "duCheckRegister.h" streamKernelSet kernelInterface::s_kernel_param;streamCamera* kernelInterface::s_cameraBase = NULL;

IplImage* kernelInterface::s_localObjMaskImage;duBKcodeBook* kernelInterface::s_duBKcodeBook = NULL;CString kernelInterface::g_strOneBKKernelImage = _T("");

kernelRes kernelInterface::s_localBKRes;std::vector<KernelInfo> kernelInterface::s_localBKObjects;

kernelInterface::kernelInterface(void){

kernelInterface::s_kernel_param.readini();

streamCamera::SetCameraType( kernelInterface::s_kernel_param.m_nTypeCamera );

if( kernelInterface::s_kernel_param.m_nTypeCamera == DHCAMERA ){

s_cameraBase = new duKernelCamera/*streamCamera*/;kernelInterface::s_nCameraImageHeight = 964;kernelInterface::s_nCameraImageWidth = 1292;

Page 9: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 8

}else{

s_cameraBase = new duKernelCamera_FC/*streamCamera*/;}{

DU_CAMERA_BASE_INFO cinfo = kernelInterface::s_cameraBase->GetCameraDescrip();

CString strDesp;strDesp.Format( L"%s",

cinfo.strModelName);

kernelInterface::s_kernel_param.m_strCameraType = strDesp;kernelInterface::s_kernel_param.writeini();

}}

kernelInterface::~kernelInterface(void){

if( s_cameraBase->m_bDevOpened ){

s_cameraBase->CloseDevice();}delete s_cameraBase;s_cameraBase = NULL;

if( kernelInterface::s_localObjMaskImage ){

cvReleaseImage( & kernelInterface::s_localObjMaskImage);}

if( kernelInterface::s_duBKcodeBook ){

delete kernelInterface::s_duBKcodeBook;kernelInterface::s_duBKcodeBook = NULL;

}

kernelInterface::s_kernel_param.writeini();}

BOOL kernelInterface:: RegisterWnd( CWnd* pDrawWnd ){

if( !pDrawWnd )return FALSE;

Page 10: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 9

kernelInterface::s_cameraBase->m_wndDrawImage = pDrawWnd;return TRUE;

}

BOOL kernelInterface::DrawBKObjectsAndCalculate( IplImage* pSource ){

USES_CONVERSION;if( !s_duBKcodeBook )

return FALSE;

if( !s_duBKcodeBook->duImaskCodeBook )return FALSE;

if( !pSource )return FALSE;

IplImage* pSourceExR = cvCreateImage( cvGetSize(pSource), 8, 1 );IplImage* pSourceExR_bin = cvCreateImage( cvGetSize(pSource), 8, 1 );{

IplImage* pR = cvCreateImage( cvGetSize(pSource), pSource->depth, 1 );

IplImage* pG = cvCreateImage( cvGetSize(pSource), pSource->depth, 1 );

IplImage* pB = cvCreateImage( cvGetSize(pSource), pSource->depth, 1 );

cvSplit( pSource, pB, pG, pR, NULL );duImageLib_CV::cvSuperColor(pR, pG, pB, pSourceExR, 2, -1, -1, FALSE

);

cvReleaseImage( &pR );cvReleaseImage( &pG );cvReleaseImage( &pB );

IplImage* pSourceExR_bin_otsu = cvCreateImage( cvGetSize(pSource), 8, 1 );

duImageLib_CV::cvThresholdOtsu( pSourceExR_bin, pSourceExR_bin_otsu );

{CvMemStorage * storage = cvCreateMemStorage(0);CvSeq * contour = 0;CvSeq * contmax = 0;int mode = CV_RETR_EXTERNAL;

Page 11: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 10

cvFindContours( pSourceExR_bin_otsu,storage, &contour, sizeof( CvContour ), mode, CV_CHAIN_APPROX_NONE, cvPoint(0,0));

int nIDObj = 0;int nIDValidObj = 0;for(;contour;contour = contour->h_next){

int area = fabs(cvContourArea( contour, CV_WHOLE_SEQ ));if( area < 10 )

continue; cvDrawContours(

pSource, contour, CV_RGB(0, 0, 255),//cvScalar(255),CV_RGB(255, 0, 255),//cvScalar(255),0,2, 8,cvPoint(0,0));

}cvReleaseMemStorage( &storage );

}cvReleaseImage( &pSourceExR_bin_otsu );

}CvScalar meanValsExR = cvAvg( pSourceExR );

if( kernelInterface::s_localObjMaskImage == NULL ){

kernelInterface::s_localObjMaskImage = cvCreateImage( cvGetSize(s_duBKcodeBook->duImaskCodeBook), 8, 1);

}

cvCopy(s_duBKcodeBook->duImaskCodeBook, kernelInterface::s_localObjMaskImage );

{cvDilate( kernelInterface::s_localObjMaskImage,

Page 12: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 11

kernelInterface::s_localObjMaskImage, NULL, kernelInterface::s_kernel_param.n_dKernelMorphSize );

cvErode( kernelInterface::s_localObjMaskImage, kernelInterface::s_localObjMaskImage, NULL, kernelInterface::s_kernel_param.n_dKernelMorphSize*2 );

cvDilate( kernelInterface::s_localObjMaskImage, kernelInterface::s_localObjMaskImage, NULL, kernelInterface::s_kernel_param.n_dKernelMorphSize );

s_localBKObjects.clear();{

CvMemStorage * storage = cvCreateMemStorage(0);CvSeq * contour = 0;CvSeq * contmax = 0;int mode = CV_RETR_EXTERNAL;

cvFindContours( kernelInterface::s_localObjMaskImage,storage, &contour,sizeof( CvContour ),mode,CV_CHAIN_APPROX_NONE,cvPoint(0,0));

int nIDObj = 0;int nIDValidObj = 0;for(;contour;contour = contour->h_next){

int area = fabs(cvContourArea( contour, CV_WHOLE_SEQ )); CvRect rc = cvBoundingRect( contour );IplImage *pSubObject = cvCreateImage( cvGetSize(pSource), 8,

1 );cvZero( pSubObject );{

cvDrawContours(pSubObject, contour, cvScalar(255),cvScalar(255),0,CV_FILLED,8,cvPoint(0,0)

Page 13: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 12

);}

CvScalar meanVals = cvAvg( pSourceExR, pSubObject );double dFillingRate = area / (double)(rc.width*rc.height);double dWidScale = fabs( rc.width / (double)rc.height );if(

area > kernelInterface::s_kernel_param.m_dAreaMin_Kernel &&dFillingRate >

kernelInterface::s_kernel_param.m_dFillingRate_Kernel && dWidScale <

kernelInterface::s_kernel_param.m_dWidScale_Kernel && (1/dWidScale) <

kernelInterface::s_kernel_param.m_dLengthScale_Kernel&& meanVals.val[0] > meanValsExR.val[0])

{cvDrawContours(

pSource, contour, CV_RGB(0, 0, 255),//cvScalar(255),CV_RGB(0, 255, 255),//cvScalar(255),0,3, 8,cvPoint(0,0));

cvDrawContours(kernelInterface::s_localObjMaskImage, contour, cvScalar(255),cvScalar(255),0,CV_FILLED,8,cvPoint(0,0));

{CvPoint2D32f center;float radius;cvMinEnclosingCircle( contour,&center,&radius );cvDrawCircle( pSource, cvPointFrom32f(center),

Page 14: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 13

radius, cvScalar(0,255,255), 3, 8, 0 );}

CvBox2D box = cvMinAreaRect2( contour );CvPoint2D32f ptf[4];cvBoxPoints( box, ptf );

CvPoint pt[4];pt[0] = cvPointFrom32f(ptf[0]);pt[1] = cvPointFrom32f(ptf[1]);pt[2] = cvPointFrom32f(ptf[2]);

pt[3] = cvPointFrom32f(ptf[3]);、for ( int ii=0; ii<3; ii++ ){

if( ii== 0 )cvDrawLine( pSource, pt[3], pt[0],

cvScalar(255,0,0), 1 );cvDrawLine( pSource, pt[ii], pt[ii+1],

cvScalar(255,0,0), 1 );}

KernelInfo ki;BOOL bUSED = TRUE;if( bUSED ){

double dLen;double dWid;CvPoint ptM0; // main axisCvPoint ptM1;CvPoint ptS0; // CvPoint ptS1;BOOL bDeter = DetermineSingleKernelGeometry(

pSource,contour,dLen,dWid,ptM0, ptM1,ptS0,ptS1);

cvDrawLine( pSource, ptM0, ptM1, cvScalar(0,0,255), 2 );

Page 15: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 14

cvDrawLine( pSource, ptS0, ptS1, cvScalar(0,255,0), 1, CV_AA );

ki.dMainAxisLen = dLen;ki.dSecondAxisLen = dWid;

ki.ptMain1 = ptM0;ki.ptMain2 = ptM1;ki.ptSecond1 = ptS0;ki.ptSecond2 = ptS1;

}else {

double ddis01 = sqrt( (ptf[0].y-ptf[1].y)*(ptf[0].y-ptf[1].y) + (ptf[0].x-ptf[1].x)*(ptf[0].x-ptf[1].x) );

double ddis12 = sqrt( (ptf[2].y-ptf[1].y)*(ptf[2].y-ptf[1].y) + (ptf[2].x-ptf[1].x)*(ptf[2].x-ptf[1].x) );

CvPoint ptMain[2];CvPoint ptSecond[2];if( ddis01 > ddis12 ){

ptMain[0].x = (pt[0].x + pt[3].x)/2;ptMain[0].y = (pt[0].y + pt[3].y)/2;ptMain[1].x = (pt[1].x + pt[2].x)/2;ptMain[1].y = (pt[1].y + pt[2].y)/2;

ptSecond[0].x = (pt[0].x + pt[1].x)/2;ptSecond[0].y = (pt[0].y + pt[1].y)/2;ptSecond[1].x = (pt[3].x + pt[2].x)/2;ptSecond[1].y = (pt[3].y + pt[2].y)/2;

}else{

ptMain[0].x = (pt[0].x + pt[1].x)/2;ptMain[0].y = (pt[0].y + pt[1].y)/2;ptMain[1].x = (pt[3].x + pt[2].x)/2;ptMain[1].y = (pt[3].y + pt[2].y)/2;

ptSecond[0].x = (pt[0].x + pt[3].x)/2;ptSecond[0].y = (pt[0].y + pt[3].y)/2;ptSecond[1].x = (pt[1].x + pt[2].x)/2;ptSecond[1].y = (pt[1].y + pt[2].y)/2;

}

Page 16: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 15

cvDrawLine( pSource, ptMain[0], ptMain[1], cvScalar(0,0,255), 2 );

cvDrawLine( pSource, ptSecond[0], ptSecond[1], cvScalar(0,255,0), 1 );

ki.dMainAxisLen = ddis01 > ddis12 ? ddis01 : ddis12;ki.dSecondAxisLen = ddis01 <= ddis12 ? ddis01 :

ddis12;

ki.ptMain1 = ptMain[0];ki.ptMain2 = ptMain[1];ki.ptSecond1 = ptSecond[0];ki.ptSecond2 = ptSecond[1];

}ki.nID = ++nIDValidObj;ki.dArea = area;ki.dFillRate = dFillingRate;ki.box = box;ki.rect = rc;

ki.pt1 = pt[0];ki.pt2 = pt[1];ki.pt3 = pt[2];ki.pt4 = pt[3];s_localBKObjects.push_back(ki);

}cvReleaseImage( &pSubObject );

}cvReleaseMemStorage( &storage );

}s_localBKRes.m_nNum_Kernels = s_localBKObjects.size();BOOL bDirectCalKernel = TRUE;

if( bDirectCalKernel ){

double dValScaleLower = kernelInterface::s_kernel_param.m_dKernelStatisticFactorLower;

double dValScaleUpper = kernelInterface::s_kernel_param.m_dKernelStatisticFactorUpper;

double dKernelLen = 0.f;double dKernelWid = 0.f;double dKernelArea = 0.f;int nKernels = s_localBKObjects.size();

Page 17: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 16

if( nKernels > 0 ){

CString strTip;std::vector<CString> vecTips;int nKernels = s_localBKObjects.size();strTip.Format( _T("kernel number: %d"), nKernels );vecTips.push_back( strTip );{

std::sort( s_localBKObjects.begin(), s_localBKObjects.end(), KernelAreaCompGreater );

strTip.Format( _T("kernel area range: %9.3f - %9.3f"), s_localBKObjects[0].dArea, s_localBKObjects[s_localBKObjects.size()-1].dArea );

vecTips.push_back( strTip );int num = 0;dKernelArea = 0;for ( int k=nKernels*dValScaleLower;

k<=nKernels*dValScaleUpper; k++){

dKernelArea += s_localBKObjects[k].dArea;num++;

}

if( num > 0 ){

dKernelArea = dKernelArea / num;}strTip.Format( _T("Selected kernel area: %d (pixels)"),

(int)dKernelArea );vecTips.push_back( strTip );s_localBKRes.m_dMaxArea_Kernel =

s_localBKObjects[0].dArea ;s_localBKRes.m_dMinArea_Kernel =

s_localBKObjects[s_localBKObjects.size()-1].dArea;}{

std::sort( s_localBKObjects.begin(), s_localBKObjects.end(), KernelMainAxisLenCompGreater );

strTip.Format( _T("kernel main axis length range: %9.3f - %9.3f"), s_localBKObjects[0].dMainAxisLen, s_localBKObjects[s_localBKObjects.size()-1].dMainAxisLen );

vecTips.push_back( strTip );int num = 0;dKernelLen = 0;

Page 18: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 17

for ( int k=nKernels*dValScaleLower; k<=nKernels*dValScaleUpper; k++)

{dKernelLen += s_localBKObjects[k].dMainAxisLen;num++;

}if( num > 0 ){

dKernelLen = dKernelLen / num;}strTip.Format( _T("Selected kernel length: %d (pixels)"),

(int)dKernelLen );vecTips.push_back( strTip );s_localBKRes.m_dLen_Kernels = dKernelLen;

}{

std::sort( s_localBKObjects.begin(), s_localBKObjects.end(), KernelMainAxisLenCompGreater );

strTip.Format( _T("kernel second axis length range: %9.3f - %9.3f"), s_localBKObjects[0].dSecondAxisLen, s_localBKObjects[s_localBKObjects.size()-1].dSecondAxisLen );

vecTips.push_back( strTip );

int num = 0;dKernelWid = 0;for ( int k=nKernels*dValScaleLower;

k<=nKernels*dValScaleUpper; k++){

dKernelWid += s_localBKObjects[k].dSecondAxisLen;num++;

}if( num > 0 ){

dKernelWid = dKernelWid / num;}

strTip.Format( _T("Selected kernel width: %d (pixels)"), (int)dKernelWid );

vecTips.push_back( strTip );s_localBKRes.m_dWid_Kernels = dKernelWid;

}}for ( int n=0; n<s_localBKObjects.size(); n++ ){

Page 19: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 18

s_localBKObjects[n].nID = n+1;

CString strTag;strTag.Format( _T("%d"), s_localBKObjects[n].nID );CvFont font; cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX, 1, 1, 1, 1, 8 ); cvPutText( pSource, W2A(strTag),

CvPoint( (int)s_localBKObjects[n].box.center.x, (int)s_localBKObjects[n].box.center.y ), &font, CV_RGB(255,0,255) );

}s_localBKRes.m_nNum_Kernels = nKernels;

}}

cvReleaseImage( &pSourceExR_bin );cvReleaseImage( &pSourceExR );

}

CCriticalSection kernelInterface::m_csData;BOOL kernelInterface::ComputeBKObject(streamKernel& kernel, kernelRes& KRes ){

USES_CONVERSION;

if( !s_cameraBase->duGetPixelDataRGB() )return FALSE;

if( !s_duBKcodeBook )return FALSE;

if( !s_duBKcodeBook->duImaskCodeBook )return FALSE;

if( !kernelInterface::s_localObjMaskImage )return FALSE;

CSingleLock dataLock( &m_csData );dataLock.Lock();IplImage *iplImage = cvLoadImage( W2A(kernel.m_strImageFile) );if( s_kernel_param.m_nTypeCamera == 0 ){

cvFlip(iplImage, iplImage, 0 );}else

Page 20: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 19

{cvSmooth(iplImage, iplImage, CV_GAUSSIAN/*CV_MEDIAN*/, 5 );

}

s_cameraBase->duGetPixelDataRGB(),3*kernelInterface::s_nCameraImageWidth);IplImage* pSource = cvCreateImage( cvGetSize(iplImage), iplImage->depth,

iplImage->nChannels );cvCopy( iplImage, pSource );cvSmooth(pSource, pSource, CV_GAUSSIAN/*CV_MEDIAN*/, 5 );

cvDilate( kernelInterface::s_localObjMaskImage, kernelInterface::s_localObjMaskImage, NULL, kernelInterface::s_kernel_param.n_dKernelMorphSize );

cvErode( kernelInterface::s_localObjMaskImage, kernelInterface::s_localObjMaskImage, NULL, kernelInterface::s_kernel_param.n_dKernelMorphSize*2 );

cvDilate( kernelInterface::s_localObjMaskImage, kernelInterface::s_localObjMaskImage, NULL, kernelInterface::s_kernel_param.n_dKernelMorphSize );

CString strTip;CString strResPath =

duImageProcess_ITK::GetFilePathName(KRes.m_filename);

if( CORNREGISTERSTRU::GetUserType( kernelInterface::s_kernel_param.m_strUserLabel) == CORN_DEVELOPER )

{{

strTip.Format( L"%s\\bk_pMask.png", strResPath );cvSaveImage( W2A(strTip), kernelInterface::s_localObjMaskImage );

}{

strTip.Format( L"%s\\bk_source.png", strResPath );cvSaveImage( W2A(strTip), pSource );

}

}IplImage* pResult = cvCreateImage( cvGetSize(pSource), pSource->depth,

pSource->nChannels );cvZero( pResult );CString strObjRGBMasked;cvAddS( pSource,CvScalar(0), pResult,

kernelInterface::s_localObjMaskImage );

Page 21: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 20

{strObjRGBMasked.Format( L"%s\\bk_first_seg.png", strResPath );cvSaveImage( W2A(strObjRGBMasked), pResult );

}{

for ( int i=0; i<s_localBKObjects.size(); i++ ){

cvDrawLine( pSource, s_localBKObjects[i].ptMain1, s_localBKObjects[i].ptMain2, cvScalar(0,0,255), 2 );

cvDrawLine( pSource, s_localBKObjects[i].ptSecond1, s_localBKObjects[i].ptSecond2, cvScalar(0,255,0), 1 );

cvDrawLine( pSource, s_localBKObjects[i].pt1, s_localBKObjects[i].pt2, cvScalar(255,0,0), 1 );

cvDrawLine( pSource, s_localBKObjects[i].pt2, s_localBKObjects[i].pt3, cvScalar(255,0,0), 1 );

cvDrawLine( pSource, s_localBKObjects[i].pt3, s_localBKObjects[i].pt4, cvScalar(255,0,0), 1 );

cvDrawLine( pSource, s_localBKObjects[i].pt4, s_localBKObjects[i].pt1, cvScalar(255,0,0), 1 );

CString strTag;strTag.Format( _T("%d"), s_localBKObjects[i].nID );CvFont font; cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX, 0.5, 0.5, 1, 1, 8 ); cvPutText( pSource, W2A(strTag),

CvPoint( (int)s_localBKObjects[i].box.center.x,(int)s_localBKObjects[i].box.center.y ),&font, CV_RGB(255,0,255));

}

strTip.Format( L"%s\\bk_效果图.png", strResPath );cvSaveImage( W2A(strTip), pSource );

} {

IplImage* pKernelImage_scalar = cvCreateImage(cvGetSize(pResult), 8, 1 );

BOOL bPreciseMode = TRUE; if( bPreciseMode ){

cvCvtColor( pResult, pKernelImage_scalar, CV_RGB2GRAY );IplImage* pMultiSegmentedObj = cvCreateImage(

cvGetSize(pKernelImage_scalar), 8, 1 );

Page 22: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 21

streamKernel::MultiLevelThresholdTwoPath(kernelInterface::s_kernel_param,// 1,pKernelImage_scalar,pMultiSegmentedObj ,strObjRGBMasked);

std::vector<KernelInfo> vecMultiSeg;int nIDValidObj = 0;{

CvMemStorage * storage = cvCreateMemStorage(0);CvSeq * contour = 0;CvSeq * contmax = 0;int mode = CV_RETR_EXTERNAL;

cvFindContours( pMultiSegmentedObj,storage, &contour,sizeof( CvContour ),mode,CV_CHAIN_APPROX_NONE, cvPoint(0,0));

for(;contour;contour = contour->h_next){

int area = fabs(cvContourArea( contour, CV_WHOLE_SEQ )); CvRect rc = cvBoundingRect( contour );double dFillRate = area / (double)(rc.width*rc.height);double dWidScale = fabs( rc.width / (double)rc.height );

if( area >

kernelInterface::s_kernel_param.m_dAreaMin_Kernel )

{KernelInfo ki;ki.nID = ++nIDValidObj;ki.dArea = area;ki.rect = rc;

Page 23: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 22

CvPoint2D32f center;float radius;cvMinEnclosingCircle( contour,&center,&radius );ki.center = center;ki,radius = radius;

vecMultiSeg.push_back(ki);cvDrawCircle( pSource, cvPointFrom32f(center),

radius, cvScalar(0,255,255), 3, 8, 0 );

CString strTag;strTag.Format( _T("%d"), nIDValidObj );CvFont font; cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX, 1.1, 1.1,

1, 1, 8 ); cvPutText( pSource, W2A(strTag),

cvPointFrom32f(center),&font, CV_RGB(0,255,255));

}}

cvReleaseMemStorage( &storage );}

{

strTip.Format( L"%s\\bk_效果图_2.png", strResPath );cvSaveImage( W2A(strTip), pSource );

}

if( CORNREGISTERSTRU::GetUserType( kernelInterface::s_kernel_param.m_strUserLabel) == CORN_DEVELOPER )

{CString strSegmented;strSegmented.Format( _T("%s\\bk_obj_seg.png"), strResPath );cvSaveImage( W2A(strSegmented), pMultiSegmentedObj );strSegmented.Format( _T("%s\\bk_obj_scalar.png"),

strResPath );cvSaveImage( W2A(strSegmented), pKernelImage_scalar );

}KRes.m_nNum_Kernels = vecMultiSeg.size();std::vector<kernelRes> vecValidSingleKernel;{

Page 24: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 23

{CvMemStorage * storage = cvCreateMemStorage(0);CvSeq * contour = 0;CvSeq * contmax = 0;int mode = CV_RETR_EXTERNAL;

cvFindContours( kernelInterface::s_localObjMaskImage,storage, &contour,sizeof( CvContour ),mode,CV_CHAIN_APPROX_NONE, cvPoint(0,0));

int nIDObj = 0;for(;contour;contour = contour->h_next){

int area = fabs(cvContourArea( contour, CV_WHOLE_SEQ ));

if( area < kernelInterface::s_kernel_param.m_dAreaMin_Kernel )

continue;nIDObj++;CvPoint2D32f center;float radius;cvMinEnclosingCircle( contour,&center,&radius );int nContainKernel = 0;for ( int ii=0; ii<vecMultiSeg.size(); ii++ ){

double dis = sqrtf((center.x -

vecMultiSeg[ii].center.x)*(center.x - vecMultiSeg[ii].center.x) +(center.y -

vecMultiSeg[ii].center.y)*(center.y - vecMultiSeg[ii].center.y) );

if( dis < radius ) nContainKernel ++;

}{

double dLen;double dWid;CvPoint ptM0;

Page 25: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 24

CvPoint ptM1;CvPoint ptS0;CvPoint ptS1;BOOL bDeter = DetermineSingleKernelGeometry(

pSource,contour,dLen,dWid,ptM0,ptM1,ptS0, ptS1);

cvDrawLine( pSource, ptM0, ptM1, cvScalar(0,0,255), 2 );

cvDrawLine( pSource, ptS0, ptS1, cvScalar(0,255,0), 1, CV_AA );

kernelRes kr;kr.m_dLen_Kernels = dLen;kr.m_dWid_Kernels = dWid;vecValidSingleKernel.push_back(kr);

}}

cvReleaseMemStorage( &storage );}

if( vecValidSingleKernel.size() > 0 ){

double daver_len = 0;double daver_wid = 0;for ( int kk=0; kk<vecValidSingleKernel.size(); kk++ ){

daver_len += vecValidSingleKernel[kk].m_dLen_Kernels;daver_wid += vecValidSingleKernel[kk].m_dWid_Kernels;

}

KRes.m_dLen_Kernels = daver_len /(int)vecValidSingleKernel.size();

KRes.m_dWid_Kernels = daver_wid /(int)vecValidSingleKernel.size();

}else

Page 26: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 25

{KRes.m_dLen_Kernels = s_localBKRes.m_dLen_Kernels;KRes.m_dWid_Kernels = s_localBKRes.m_dWid_Kernels;

}}cvReleaseImage( &pMultiSegmentedObj );

}else{

cvCvtColor( pResult, pKernelImage_scalar, CV_RGB2GRAY );IplImage* pMultiSegmentedObj = cvCreateImage(

cvGetSize(pKernelImage_scalar), 8, 1 );streamKernel::MultiLevelThresholdTwoPath(

kernelInterface::s_kernel_param,pKernelImage_scalar,pMultiSegmentedObj ,strObjRGBMasked);

std::vector<KernelInfo> vecMultiSeg;int nIDValidObj = 0;{

CvMemStorage * storage = cvCreateMemStorage(0);CvSeq * contour = 0;CvSeq * contmax = 0;int mode = CV_RETR_EXTERNAL;cvFindContours(

pMultiSegmentedObj,storage,&contour,sizeof( CvContour ),mode,CV_CHAIN_APPROX_NONE,cvPoint(0,0));

for(;contour;contour = contour->h_next){

int area = fabs(cvContourArea( contour, CV_WHOLE_SEQ ));CvRect rc = cvBoundingRect( contour );double dFillRate = area / (double)(rc.width*rc.height);double dWidScale = fabs( rc.width / (double)rc.height );

if(area >

Page 27: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 26

kernelInterface::s_kernel_param.m_dAreaMin_Kernel){

KernelInfo ki;ki.nID = ++nIDValidObj;ki.dArea = area;ki.rect = rc; CvPoint2D32f center;float radius;cvMinEnclosingCircle( contour,&center,&radius );ki.center = center;ki,radius = radius;vecMultiSeg.push_back(ki);

}}

cvReleaseMemStorage( &storage );}

if( CORNREGISTERSTRU::GetUserType( kernelInterface::s_kernel_param.m_strUserLabel) == CORN_DEVELOPER )

{CString strSegmented;strSegmented.Format( _T("%s\\bk_obj_seg.png"), strResPath );cvSaveImage( W2A(strSegmented), pMultiSegmentedObj );strSegmented.Format( _T("%s\\bk_obj_scalar.png"),

strResPath );cvSaveImage( W2A(strSegmented), pKernelImage_scalar );

}

KRes.m_nNum_Kernels = vecMultiSeg.size();KRes.m_dLen_Kernels = s_localBKRes.m_dLen_Kernels;KRes.m_dWid_Kernels = s_localBKRes.m_dWid_Kernels;cvReleaseImage( &pMultiSegmentedObj );

}cvReleaseImage( &pKernelImage_scalar );

}

cvReleaseImageHeader( &iplImage );cvReleaseImage ( &pResult );cvReleaseImage( &pSource );s_localBKRes.m_strKernelIni = KRes.m_strKernelIni;KRes.writeini();dataLock.Unlock(); return TRUE;

Page 28: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 27

}

BOOL kernelInterface::SplitSingleKernel( IplImage* pSourceRGB, IplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double

& dMaxArea,CvPoint ptOrigin)

{USES_CONVERSION;

IplImage *pKernelImage = pSubObject;

cvDrawLine( pKernelImage, pt1, pt2, CvScalar(0), 3);

CvMemStorage * storage = cvCreateMemStorage(0);CvSeq * contour = 0;CvSeq * contmax = 0;int mode = CV_RETR_EXTERNAL;

cvFindContours( pKernelImage,storage, &contour,sizeof( CvContour ),mode,CV_CHAIN_APPROX_NONE,cvPoint(0,0))

std::vector<double> vecArea;std::vector<CvScalar> vecScalar;

for(;contour;contour = contour->h_next){

int area = fabs(cvContourArea( contour, CV_WHOLE_SEQ )); vecArea.push_back( area );{

IplImage* pSubSub = cvCreateImage( cvGetSize(pSourceRGB), 8, 1 );cvZero( pSubSub );

cvDrawContours(pSubSub, contour, cvScalar(255),

Page 29: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 28

cvScalar(255),0,CV_FILLED,8,cvPoint(0,0));

CvScalar meanscal, sdvscal;cvAvgSdv(pSourceRGB,&meanscal,&sdvscal,pSubSub );vecScalar.push_back( meanscal );cvReleaseImage( &pSubSub );

}

if( vecArea.size()==2 ){

double ds1 = vecScalar[0].val[0]+vecScalar[0].val[1]+vecScalar[0].val[2];

double ds2 = vecScalar[1].val[0]+vecScalar[1].val[1]+vecScalar[1].val[2];

dMaxArea = ds1>ds2?ds1:ds2;

double dmax = vecArea[0] > vecArea[1] ? vecArea[0] : vecArea[1];double dmin = vecArea[0] < vecArea[1] ? vecArea[0] : vecArea[1];

if( abs(dmin)>1e-6 ){

dScale = dmax/dmin;return TRUE;

}}return FALSE;

}

BOOL kernelInterface:: PictureWindows(const CString &strPicFile, CString &sError){

CString strSystemDir=L"";::GetSystemDirectory(strSystemDir.GetBuffer(256), 256);strSystemDir.ReleaseBuffer();

CString strRundll = strSystemDir + L"\\rundll32.exe";

CString strParm;strParm.Format( L"%s//shimgvw.dll imageview_fullscreen %s",

strSystemDir, strPicFile);

Page 30: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 29

HINSTANCE hNewExe = ShellExecute(NULL, L"Open", strRundll, strParm, NULL, SW_SHOW);

if ((DWORD)hNewExe <= 32){

CString sFormat;sFormat.Format( L"return value:%d\n", (DWORD)hNewExe);sError = sFormat;return FALSE;

}

return TRUE;}

BOOL kernelInterface::DetermineSingleKernelGeometry(IplImage* pSourceRGB,CvSeq *contour,double &dLen,double &dWid,CvPoint &ptM0, CvPoint &ptM1,CvPoint &ptS0, CvPoint &ptS1)

{int area = fabs(cvContourArea( contour, CV_WHOLE_SEQ ));if( area < kernelInterface::s_kernel_param.m_dAreaMin_Kernel )

return FALSE;

CvPoint2D32f center;float radius;cvMinEnclosingCircle( contour,&center,&radius );

CvRect rc = cvBoundingRect( contour );CvBox2D box = cvMinAreaRect2( contour );CvPoint2D32f ptf[4];cvBoxPoints( box, ptf ); CvPoint pt[4];pt[0] = cvPointFrom32f(ptf[0]);pt[1] = cvPointFrom32f(ptf[1]);pt[2] = cvPointFrom32f(ptf[2]);pt[3] = cvPointFrom32f(ptf[3]);{

IplImage* pKernelBin = cvCreateImage(

Page 31: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 30

cvGetSize(pSourceRGB),8, 1);

cvDrawContours(pKernelBin, contour, cvScalar(255),cvScalar(255),0,CV_FILLED);

IplImage *pSubObject = cvCreateImage( cvGetSize(pKernelBin), 8, 1 );IplImage *pSubObject1 = cvCreateImage( cvGetSize(pKernelBin), 8,

1 );IplImage *pSubObject2 = cvCreateImage( cvGetSize(pKernelBin), 8,

1 );cvCopy( pKernelBin, pSubObject );cvCopy( pKernelBin, pSubObject1 );cvCopy( pKernelBin, pSubObject2 );{

double d02 = sqrt( (ptf[0].y-ptf[1].y)*(ptf[0].y-ptf[1].y) + (ptf[0].x-ptf[1].x)*(ptf[0].x-ptf[1].x) );

double d24 = sqrt( (ptf[2].y-ptf[1].y)*(ptf[2].y-ptf[1].y) + (ptf[2].x-ptf[1].x)*(ptf[2].x-ptf[1].x) );

CvPoint d4,d6;CvPoint d5,d7;d4.x = (int)(ptf[0].x + ptf[1].x)/2;d4.y = (int)(ptf[0].y + ptf[1].y)/2;d6.x = (int)(ptf[3].x + ptf[2].x)/2;d6.y = (int)(ptf[3].y + ptf[2].y)/2;

d7.x = (int)(ptf[0].x + ptf[3].x)/2;d7.y = (int)(ptf[0].y + ptf[3].y)/2;d5.x = (int)(ptf[1].x + ptf[2].x)/2;d5.y = (int)(ptf[1].y + ptf[2].y)/2;double scale57=0; double scale46=0;double dMaxArea57=0;double dMaxArea46=0;BOOL bok1 = SplitSingleKernel( pSourceRGB, pSubObject1, d4, d6,

scale57, dMaxArea57, CvPoint( rc.x, rc.y ) );BOOL bok2 = SplitSingleKernel( pSourceRGB, pSubObject2, d5, d7,

Page 32: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 31

scale46, dMaxArea46, CvPoint( rc.x, rc.y ) );if( dMaxArea46 > dMaxArea57){

dLen = sqrtf( (d4.x-d6.x)*(d4.x-d6.x) + (d4.y-d6.y)*(d4.y-d6.y) );

dWid = sqrtf( (d5.x-d7.x)*(d5.x-d7.x) + (d5.y-d7.y)*(d5.y-d7.y) );

ptM0 = d4; ptM1 = d6; ptS0 = d5; ptS1 = d7;

}else{

dLen = sqrtf( (d5.x-d7.x)*(d5.x-d7.x) + (d5.y-d7.y)*(d5.y-d7.y) );

dWid = sqrtf( (d4.x-d6.x)*(d4.x-d6.x) + (d4.y-d6.y)*(d4.y-d6.y) );

ptM0 = d5; ptM1 = d7; ptS0 = d4; ptS1 = d6;

}

}cvReleaseImage( &pSubObject );cvReleaseImage( &pSubObject1 );cvReleaseImage( &pSubObject2 );cvReleaseImage( &pKernelBin );

}return TRUE;

}

#pragma once#include "streamcamera.h"#include "inc/GxIAPI.h"#include "inc/DxImageProc.h"#include "SerialPort.h"#include "afxwin.h"#include "afxcmn.h"#include "tlhelp32.h"#include "Psapi.h"#pragma comment(lib,"Psapi.lib")class AFX_CLASS_EXPORT duCommonCameraDlg : public CBkDialogST{

DECLARE_DYNAMIC(duCommonCameraDlg)

Page 33: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 32

public:

duCommonCameraDlg(CWnd* pParent = NULL); // 标准构造函数duCommonCameraDlg(

CString strObj ,

CWnd* pParent = NULL); // 标准构造函数virtual ~duCommonCameraDlg();

enum { IDD = IDD_DIALOG_COMMON_CAMERA };

CWnd* m_pParent;CString m_strObjName;

public:CBrush g_ui_redbrush;CBrush g_ui_bluebrush;CBrush g_ui_bkbrush;COLORREF g_ui_redcolor;COLORREF g_ui_bluecolor;COLORREF g_ui_textcolor;COLORREF g_ui_bkcolor;void DrawStringInStyle(

CDC* pDC,int nFontHeight,Gdiplus::Point & pt,CString strTip,Gdiplus::Color clr,int nlineWid,CString strFont);

BOOL OpenFromOutSide();

public:void UpCameraUI();CButtonST m_btnOpenDevice;CFont m_fntPropList;void SetPropListFont();

HICON m_hIconRed; //串口打开时的红灯图标句柄HICON m_hIconOff; //串口关闭时的指示图标句柄HICON m_hIconGreen;

protected:virtual void DoDataExchange(CDataExchange* pDX); DECLARE_MESSAGE_MAP()

virtual BOOL OnInitDialog();

Page 34: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 33

CMFCPropertyGridCtrl m_propGridCtrl_Camera;afx_msg LRESULT OnPropertyChanged(WPARAM,LPARAM); afx_msg void OnBnClickedMfcbuttonOpenDevice();

afx_msg void OnBnClickedMfcbuttonSaveImg();CStatic m_ctrlIconCameraOpenoff;virtual BOOL PreTranslateMessage(MSG* pMsg);

afx_msg void OnBnClickedButtonAutoCalibration();double m_dPSNR_bk;afx_msg void OnBnClickedButtonModifyPixelResolution();CString m_strPixelResolution;

public:virtual INT_PTR DoModal();virtual BOOL Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);virtual void OnFinalRelease();virtual void Serialize(CArchive& ar);afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);afx_msg void OnPaint();afx_msg void OnSize(UINT nType, int cx, int cy);afx_msg void OnTimer(UINT_PTR nIDEvent);

afx_msg void OnStnClickedMfcpropertygridCamera();};

#include "stdafx.h"#include "kernelMeasureDll.h"#include "duCommonCameraDlg.h"#include "afxdialogex.h"#include "kernelInterface.h"IMPLEMENT_DYNAMIC(duCommonCameraDlg, CBkDialogST)

duCommonCameraDlg::duCommonCameraDlg(CWnd* pParent /*=NULL*/): CBkDialogST(duCommonCameraDlg::IDD, pParent), m_dPSNR_bk(0), m_strPixelResolution(_T("0.031")){}

duCommonCameraDlg::duCommonCameraDlg(CString strObj,CWnd* pParent /*=NULL*/)

Page 35: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 34

: CBkDialogST(duCommonCameraDlg::IDD, pParent), m_dPSNR_bk(0), m_strPixelResolution(_T("0.031"))

{m_strObjName = strObj;this->m_pParent = pParent;EnableAutomation();

HMODULE hDLL = GetModuleHandle(_T("kernelMeasureDll.dll"));HINSTANCE hEXE = AfxGetResourceHandle();AfxSetResourceHandle((HINSTANCE)hDLL);BOOL bCreated = CBkDialogST::Create( duCommonCameraDlg::IDD,

CWnd::FromHandle(pParent->GetSafeHwnd()));

if ( !bCreated ){

AfxMessageBox( _T("创建面板失败,资源共享问题。"));}

SUCCEEDED(bCreated);

AfxSetResourceHandle(hEXE); }

duCommonCameraDlg::~duCommonCameraDlg(){}

void duCommonCameraDlg::DoDataExchange(CDataExchange* pDX){

CBkDialogST::DoDataExchange(pDX);

DDX_Control(pDX, IDC_MFCPROPERTYGRID_CAMERA, m_propGridCtrl_Camera);DDX_Control(pDX, IDC_MFCBUTTON_OPEN_DEVICE, m_btnOpenDevice);DDX_Control(pDX, IDC_STATIC_CAMERA_OPENOFF, m_ctrlIconCameraOpenoff);DDX_Text(pDX, IDC_EDIT_BK_PSNR, m_dPSNR_bk);DDX_Text(pDX, IDC_EDIT_PIXEL_RESOLUTION, m_strPixelResolution);

}

BEGIN_MESSAGE_MAP(duCommonCameraDlg, CBkDialogST)ON_REGISTERED_MESSAGE(AFX_WM_PROPERTY_CHANGED, OnPropertyChanged)ON_BN_CLICKED(IDC_MFCBUTTON_OPEN_DEVICE,

&duCommonCameraDlg::OnBnClickedMfcbuttonOpenDevice)ON_BN_CLICKED(IDC_MFCBUTTON_SAVE_IMG,

Page 36: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 35

&duCommonCameraDlg::OnBnClickedMfcbuttonSaveImg)ON_BN_CLICKED(IDC_BUTTON_AUTO_CALIBRATION, &duCommonCameraDlg::OnBnClickedButtonAutoCalibration)ON_BN_CLICKED(IDC_BUTTON_MODIFY_PIXEL_RESOLUTION, &duCommonCameraDlg::OnBnClickedButtonModifyPixelResolution)ON_WM_COPYDATA()ON_WM_CTLCOLOR()ON_WM_PAINT()ON_WM_SIZE()ON_WM_TIMER()ON_STN_CLICKED(IDC_MFCPROPERTYGRID_CAMERA, &duCommonCameraDlg::OnStnClickedMfcpropertygridCamera)END_MESSAGE_MAP()

void duCommonCameraDlg::SetPropListFont(){

::DeleteObject( m_fntPropList.Detach() );

LOGFONT lf;afxGlobalData.fontRegular.GetLogFont(&lf);

NONCLIENTMETRICS info;info.cbSize = sizeof(lf);

afxGlobalData.GetNonClientMetrics(info);lf.lfHeight = info.lfMenuFont.lfHeight;lf.lfWidth = info.lfMenuFont.lfWidth;lf.lfItalic = info.lfMenuFont.lfItalic;m_fntPropList.CreateFontIndirect(&lf);

m_propGridCtrl_Camera.SetFont( &m_fntPropList );}

BOOL duCommonCameraDlg::OnInitDialog(){

CBkDialogST::OnInitDialog();g_ui_redcolor =RGB(255,0,0); // redg_ui_bluecolor =RGB(0,0,255); // blueg_ui_bkcolor =RGB(11,22,44); // blueg_ui_textcolor =RGB(0,0,255); // white textg_ui_redbrush .CreateSolidBrush(g_ui_redcolor); // red backgroundg_ui_bluebrush .CreateSolidBrush(g_ui_bluecolor); // blue backgroundg_ui_bkbrush .CreateSolidBrush(g_ui_bkcolor); // blue background

Page 37: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 36

m_strPixelResolution.Format( _T("%.6f"), kernelInterface::s_kernel_param.dPhysicalResolution );

{GX_STATUS emStatus = GX_STATUS_SUCCESS;emStatus = GXInitLib();if (emStatus != GX_STATUS_SUCCESS){

// e_camera->ShowErrorString(emStatus);exit(0);

}

UpCameraUI();}

{

m_propGridCtrl_Camera.EnableHeaderCtrl(TRUE, L"属性项", L"值项");m_propGridCtrl_Camera.EnableDescriptionArea(TRUE);m_propGridCtrl_Camera.SetVSDotNetLook();m_propGridCtrl_Camera.AdjustLayout();m_propGridCtrl_Camera.MarkModifiedProperties();HDITEM item; item.cxy=120; item.mask=HDI_WIDTH; m_propGridCtrl_Camera.GetHeaderCtrl().SetItem(0, new HDITEM(item));

}

short shBtnColor = 30;m_btnOpenDevice.SetIcon(IDI_ICON_CAMERA_OPEN);m_btnOpenDevice.OffsetColor(CButtonST::BTNST_COLOR_FG_IN, shBtnColor);m_btnOpenDevice.DrawFlatFocus(TRUE);m_btnOpenDevice.SetFlat(FALSE);m_hIconRed = AfxGetApp()->LoadIcon(IDI_ICON_RED);m_hIconOff = AfxGetApp()->LoadIcon(IDI_ICON_OFF);m_ctrlIconCameraOpenoff.SetIcon( m_hIconOff );this->UpdateData(FALSE);return TRUE; // return TRUE unless you set the focus to a control

}

BOOL duCommonCameraDlg::PreTranslateMessage(MSG* pMsg){

if( pMsg->message == WM_KEYDOWN ){

if(pMsg->wParam == VK_RETURN

Page 38: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 37

|| pMsg->wParam == VK_ESCAPE ){

::TranslateMessage(pMsg);::DispatchMessage(pMsg);return TRUE; // DO NOT process further

}}

return CBkDialogST::PreTranslateMessage(pMsg);}

LRESULT duCommonCameraDlg::OnPropertyChanged (WPARAM,LPARAM lParam) {

CMFCPropertyGridProperty* pProp = (CMFCPropertyGridProperty*) lParam;

CString name = pProp->GetName();COleVariant oleval = pProp->GetValue();double dChanged;bool bChanged;

if ( name.CompareNoCase( _T("触发模式")) == 0 ||name.CompareNoCase( _T("触发源")) == 0 ||name.CompareNoCase( _T("触发极性")) == 0 ||name.CompareNoCase( _T("自动白平衡")) == 0 ||name.CompareNoCase( _T("白平衡通道")) == 0 ||name.CompareNoCase( _T("白平衡系数")) == 0 ||name.CompareNoCase( _T("曝光")) == 0 ||name.CompareNoCase( _T("增益")) == 0 )

{kernelInterface::s_cameraBase-

>UpdateObjFromPropList( &m_propGridCtrl_Camera, pProp );}

return 0;}

#include "duKernelCamera.h"BOOL duCommonCameraDlg::OpenFromOutSide(){

if( kernelInterface::s_cameraBase->m_bDevOpened ){

return TRUE;}

Page 39: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 38

else{

BOOL bOpen = kernelInterface::s_cameraBase->OpenDevice();

if( !bOpen ){

AfxMessageBox( _T("无法打开相机") );kernelInterface::s_cameraBase->m_bDevOpened = FALSE;return FALSE;

}else{

kernelInterface::s_cameraBase->m_bDevOpened = TRUE;kernelInterface::s_cameraBase-

>FillPropGridCtrl( &m_propGridCtrl_Camera );if( kernelInterface::s_cameraBase ){

kernelInterface::s_cameraBase->StartCapture();}

}}

UpCameraUI();this->UpdateData(FALSE);

return TRUE;}

void duCommonCameraDlg::OnBnClickedMfcbuttonOpenDevice(){

if( kernelInterface::s_cameraBase->m_bDevOpened ){

BOOL bOk = kernelInterface::s_cameraBase->CloseDevice();if( bOk )

kernelInterface::s_cameraBase->m_bDevOpened = FALSE;else

kernelInterface::s_cameraBase->m_bDevOpened = TRUE;}else{

BOOL bOpen = kernelInterface::s_cameraBase->OpenDevice();

if( !bOpen ){

Page 40: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 39

AfxMessageBox( _T("无法打开相机") );kernelInterface::s_cameraBase->m_bDevOpened = FALSE;

}else{

kernelInterface::s_cameraBase->m_bDevOpened = TRUE;kernelInterface::s_cameraBase-

>FillPropGridCtrl( &m_propGridCtrl_Camera );if( kernelInterface::s_cameraBase ){

kernelInterface::s_cameraBase->StartCapture();}

}}

UpCameraUI();

this->UpdateData(FALSE);}

void duCommonCameraDlg::UpCameraUI(){

if( kernelInterface::s_cameraBase->m_bDevOpened ){

m_btnOpenDevice.SetWindowTextW(L"关闭摄像机");m_ctrlIconCameraOpenoff.SetIcon( m_hIconRed );

}else{

m_btnOpenDevice.SetWindowTextW(L"打开摄像机");m_ctrlIconCameraOpenoff.SetIcon( m_hIconOff );

}}void duCommonCameraDlg::OnBnClickedMfcbuttonSaveImg(){

USES_CONVERSION;

CString strPre;SYSTEMTIME sysTime;GetLocalTime(&sysTime);strPre.Format( L"Captured%.4d_%.2d_%.2d_%.2d_%.2d_%.2d_%.3d.jpg",

sysTime.wYear,sysTime.wMonth,sysTime.wDay,

Page 41: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 40

sysTime.wHour,sysTime.wMinute,sysTime.wSecond,sysTime.wMilliseconds);

CString strFileName ;strFileName.Format( _T("%s\\%s"),

kernelInterface::s_kernel_param.m_strWorkPathName, strPre );

kernelInterface::s_cameraBase->SaveImage( strFileName);CString sError;kernelInterface::PictureWindows( strFileName, sError );ShellExecuteW(this->m_hWnd, L"open", L"mspaint.exe", (strFileName), L"",

SW_SHOW );}

void duCommonCameraDlg::OnBnClickedButtonAutoCalibration(){

if( kernelInterface::s_cameraBase->m_bDevOpened && kernelInterface::s_cameraBase->m_bIsSnap )

{double dPR=0.f;BOOL bSuc = kernelInterface::s_cameraBase-

>CalculatePixelResolutionByCoin( dPR,kernelInterface::s_nCameraImageWidth,kernelInterface::s_nCameraImageHeight);

if( bSuc && abs(dPR) > 1e-6 ){

CString strTip;

strTip.Format( _T("检测到圆直径为:%6.2f,按照一元硬币(直径 2.5cm)换算?"), dPR );

AfxGetApp()->m_pszAppName = _T("籽粒考种-分辨率自动校正");if( IDYES == AfxMessageBox(strTip, MB_ICONEXCLAMATION|

MB_YESNO ) ){

strTip.Format( _T("%.6f"), 2.5/dPR );m_strPixelResolution = strTip;

}}

}

Page 42: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 41

else{

CString strCalibrationFile = L"";LPCTSTR szFilter;

szFilter = _T(" 标 定 文 件 (*.jpg)|*.jpg|(*.png)|*.png|(*.bmp)|*.bmp|All(*.*)|*.*|");

CFileDialog cFileDialog(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);

CONST DWORD nMaxFile = 1024*1024; WCHAR* pbFileNameBuf = new WCHAR[nMaxFile]; if ( NULL == pbFileNameBuf ) {

return ; // E_OUTOFMEMORY } memset(pbFileNameBuf, 0, nMaxFile);

cFileDialog.m_pOFN->lpstrFile = pbFileNameBuf; cFileDialog.m_pOFN->nMaxFile = nMaxFile;

if ( IDOK == cFileDialog.DoModal() ) {

POSITION pos = cFileDialog.GetStartPosition(); while ( NULL != pos ) {

CString strName = cFileDialog.GetNextPathName(pos); strCalibrationFile = strName;

} }

if ( NULL != pbFileNameBuf ) {

delete[] pbFileNameBuf; pbFileNameBuf = NULL;

}

CFileFind finder;if( !finder.FindFile(strCalibrationFile) )

return;

{double dPR=0.f;BOOL bSuc = kernelInterface::s_cameraBase-

>CalculatePixelCalibration( strCalibrationFile, dPR );

Page 43: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 42

if( bSuc && abs(dPR) > 1e-6 ){

m_strPixelResolution.Format( _T(".6f"), dPR );// m_dPixelResolution = dPR;

}}

}

this->UpdateData(FALSE);}

void duCommonCameraDlg::OnBnClickedButtonModifyPixelResolution(){

USES_CONVERSION;this->UpdateData(TRUE);

double dPixelResolution = atof( W2A(m_strPixelResolution) ); if( abs(dPixelResolution) < 1e-9 || abs(dPixelResolution) > 1e8 ){

AfxMessageBox( L"像素尺寸不合理" );return;

}{

kernelInterface::s_kernel_param.dPhysicalResolution = dPixelResolution;

kernelInterface::s_kernel_param.writeini();}

}

INT_PTR duCommonCameraDlg::DoModal(){

return CBkDialogST::DoModal();}

BOOL duCommonCameraDlg::Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd){

return CBkDialogST::Create(lpszTemplateName, pParentWnd);}

void duCommonCameraDlg::OnFinalRelease(){

CBkDialogST::OnFinalRelease();

Page 44: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 43

}

void duCommonCameraDlg::Serialize(CArchive& ar){

if (ar.IsStoring()){}else{}

}

BOOL duCommonCameraDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct){

return CBkDialogST::OnCopyData(pWnd, pCopyDataStruct);}

HBRUSH duCommonCameraDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){

{HBRUSH hbr; switch (nCtlColor) { case CTLCOLOR_EDIT:case CTLCOLOR_MSGBOX:

switch (pWnd->GetDlgCtrlID()){ case IDC_EDIT_PIXEL_RESOLUTION: case IDC_EDIT_BK_PSNR:

pDC->SetBkColor(g_ui_bkcolor); pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(g_ui_redcolor); hbr =g_ui_bkbrush;break;

default: hbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor); break;

} break;

case CTLCOLOR_STATIC:case CTLCOLOR_BTN:case CTLCOLOR_LISTBOX:

switch (pWnd->GetDlgCtrlID())

Page 45: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 44

{ case IDC_STATIC:

pDC->SetBkMode( TRANSPARENT );pDC->SetTextColor(g_ui_bluecolor); hbr = (HBRUSH)::GetStockObject(NULL_BRUSH);

break;default:

hbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);}break;

default:hbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);

}return hbr; // return brush

}}void duCommonCameraDlg::OnPaint(){

CPaintDC dc(this); CRect rcClient;this->GetClientRect( &rcClient );CDC MemDC; CBitmap MemBitmap; MemDC.CreateCompatibleDC(&dc); MemBitmap.CreateCompatibleBitmap( &dc, rcClient.Width(),

rcClient.Height() ); CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); MemDC.FillSolidRect(0,0, rcClient.Width(),

rcClient.Height() ,RGB(204,236,255)); {

CString strTip = m_strObjName;int nFontHeight = 20;Gdiplus::Point pt;pt.X = 40;pt.Y = 10;DrawStringInStyle

(&MemDC,nFontHeight,pt,strTip,Gdiplus::Color(255,0,0),2,

_T("黑体")

Page 46: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 45

);}

dc.BitBlt(0,0, rcClient.Width(), rcClient.Height() ,&MemDC,0,0,SRCCOPY); MemBitmap.DeleteObject(); MemDC.DeleteDC();

}

void duCommonCameraDlg::DrawStringInStyle(CDC* pDC,int nFontHeight,Gdiplus::Point & pt,CString strTip,Gdiplus::Color clr,int nlineWid,CString strFont)

{Graphics graph(*pDC);Graphics graphics(*pDC);graphics.SetSmoothingMode(SmoothingModeAntiAlias);graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);

FontFamily fontFamily(/*L"黑体"*/ strFont );StringFormat strformat;

GraphicsPath path;path.AddString(

strTip ,wcslen(strTip ),&fontFamily,FontStyleRegular,nFontHeight,pt,&strformat);

Pen pen(Color(255,255,0,0),2 );pen.SetColor( clr );nlineWid = nlineWid <= 0 ? 1 :nlineWid;pen.SetWidth( nlineWid );graphics.DrawPath(&pen,&path);

}

void duCommonCameraDlg::OnSize(UINT nType, int cx, int cy){

CBkDialogST::OnSize(nType, cx, cy);

Page 47: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 46

}void duCommonCameraDlg::OnTimer(UINT_PTR nIDEvent){

CBkDialogST::OnTimer(nIDEvent);}void duCommonCameraDlg::OnStnClickedMfcpropertygridCamera(){}

#pragma once#include "streamcamera.h"#include "streamKernelSet.h"class AFX_CLASS_EXPORT duKernelCamera: public streamCamera{public:

duKernelCamera(void);~duKernelCamera(void);GX_FRAME_CALLBACK_PARAM *pMyCallback;

public:

public:virtual BOOL LoadCameraIni(){ return TRUE; };virtual BOOL SaveCameraIni(){return TRUE; };virtual BOOL OpenDevice();virtual BOOL CloseDevice(); virtual BOOL StartCapture();virtual BOOL StopCapture();virtual CString SaveImage( CString strFileName = L"" );virtual unsigned char* duGetPixelData(){

return m_pBufferRaw;};virtual unsigned char* duGetPixelDataRGB(){

return m_pBufferRGB;};

virtual BITMAPINFO* duGetBITMAPINFO(){return m_pBmpInfo;

};

virtual void UpdateObjFromPropList( CMFCPropertyGridCtrl* pGridPropertyCtrl, CMFCPropertyGridProperty *pGridProperty);

static void __stdcall OnFrameCallbackFun(GX_FRAME_CALLBACK_PARAM* pFrame);

Page 48: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 47

void ShowErrorString(GX_STATUS emErrorStatus);GX_STATUS InitDevice();GX_STATUS SetPixelFormat8bit();GX_STATUS GetDeviceParam();void GetImageImproveParam();bool PrepareForShowImg();void UnPrepareForShowImg();void InitEnumUI(

GX_FEATURE_ID emFeatureID, CComboBox *pComboBox, bool bIsImplement);

void InitEnumUI(GX_FEATURE_ID emFeatureID, CMFCPropertyGridProperty *pPropertyGrid, int nSelected // dujj now value);

void duDrawImage(BYTE *pImageBuf, int nImageSize) ;void duSaveImage();

BOOL SaveKernelImage( CString strImage );virtual void ForceUpdate();virtual DU_CAMERA_BASE_INFO GetCameraDescrip() ;

};

#include "StdAfx.h"#include "duKernelCamera.h"#include "duImageProcess_ITK.h"#include "CommonParams.h"#include "kernelDetectDlg.h"#include "kernelInterface.h"#define WHITE_BALANCE_RNTRY 3 #define GX_VERIFY(emStatus) \

if (emStatus != GX_STATUS_SUCCESS)\{\

ShowErrorString(emStatus); \return ;\

} #define GX_VERIFY_RETURN(emStatus) \

if (emStatus != GX_STATUS_SUCCESS)\{\

ShowErrorString(emStatus); \return FALSE;\

}

Page 49: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 48

#define VERIFY_STATUS_RET(emStatus) \if (emStatus != GX_STATUS_SUCCESS) \

{\return emStatus;\

}\

duKernelCamera::duKernelCamera( ):m_strFilePath(""){

kernelInterface::s_localObjMaskImage = NULL;pMyCallback = NULL;memset(m_chBmpBuf,0,sizeof(m_chBmpBuf));GX_STATUS emStatus = GX_STATUS_SUCCESS;emStatus = GXInitLib();if (emStatus != GX_STATUS_SUCCESS){

ShowErrorString(emStatus);exit(0);

}

CString strDate = L"";char szName[MAX_PATH] = {0};CString strAppFullName = L""; m_strFilePath = duImageProcess_ITK::GetModulePathName();

}

duKernelCamera::~duKernelCamera(void){

if( m_bDevOpened )CloseDevice();

if( pMyCallback ){

delete pMyCallback;pMyCallback = NULL;

}if( kernelInterface::s_localObjMaskImage ){

cvReleaseImage( &kernelInterface::s_localObjMaskImage );kernelInterface::s_localObjMaskImage = NULL;

}}

void duKernelCamera::ShowErrorString(GX_STATUS emErrorStatus){

Page 50: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 49

USES_CONVERSION;

char chErrorInof[512] = {0};size_t nSize = 512;GX_STATUS emStatus = GX_STATUS_ERROR;

emStatus = GXGetLastError (&emErrorStatus, chErrorInof, &nSize);if (emStatus != GX_STATUS_SUCCESS){

m_lbCameraInfo.AddItem( L"GXGetLastError接口调用失败!" );m_lbCameraInfo.SelectItem( m_lbCameraInfo.GetCount()-1);

MessageBox("GXGetLastError接口调用失败!");}else{

m_lbCameraInfo.AddItem( A2W(chErrorInof) );m_lbCameraInfo.SelectItem( m_lbCameraInfo.GetCount()-1);MessageBox((LPCTSTR)chErrorInof);

}}void duKernelCamera::InitEnumUI(GX_FEATURE_ID emFeatureID, CMFCPropertyGridProperty *pPropertyGrid,

int nSelected ){

USES_CONVERSION;if ((pPropertyGrid == NULL) )//|| !bIsImplement){

return;}

GX_ENUM_DESCRIPTION *pEnum = NULL;GX_STATUS emStatus = GX_STATUS_ERROR;size_t nbufferSize = 0;uint32_t nEntryNum = 0;int64_t nEnumValue = -1;int nCursel = 0;double dValue = 0;emStatus = GXGetEnumEntryNums(m_hDevice, emFeatureID, &nEntryNum);GX_VERIFY(emStatus);nbufferSize = nEntryNum * sizeof(GX_ENUM_DESCRIPTION);pEnum = new GX_ENUM_DESCRIPTION[nEntryNum];if (pEnum == NULL){

return;

Page 51: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 50

}

emStatus = GXGetEnumDescription(m_hDevice, emFeatureID, pEnum, &nbufferSize);

if (emStatus != GX_STATUS_SUCCESS){

if (pEnum != NULL){

delete []pEnum;pEnum = NULL;

}ShowErrorString(emStatus);return;

}

emStatus = GXGetEnum(m_hDevice, emFeatureID, &nEnumValue);if (emStatus != GX_STATUS_SUCCESS){

if (pEnum != NULL){

delete []pEnum;pEnum = NULL;

}ShowErrorString(emStatus);return;

}

for (uint32_t i = 0; i < nEntryNum; i++){

pPropertyGrid->AddOption( A2W(pEnum[i].szSymbolic), FALSE );pPropertyGrid->SetData( (uint32_t)pEnum[i].nValue );if (pEnum[i].nValue == nSelected){

nCursel = i;}

}

pPropertyGrid->SetValue( A2W(pEnum[nCursel].szSymbolic) );

if (pEnum != NULL){

delete []pEnum;pEnum = NULL;

}

Page 52: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 51

}

void duKernelCamera::FillPropGridCtrl( CMFCPropertyGridCtrl* pGridPropertyCtrl ){

USES_CONVERSION;if ( !pGridPropertyCtrl )

return;pGridPropertyCtrl->RemoveAll();

GX_FEATURE_ID emFeatureID = GX_ENUM_TRIGGER_MODE;

GX_ENUM_DESCRIPTION *pEnum = NULL;GX_STATUS emStatus = GX_STATUS_ERROR;size_t nbufferSize = 0;uint32_t nEntryNum = 0;int64_t nEnumValue = -1;int nCursel = 0;double dValue = 0;emStatus = GXGetEnumEntryNums(m_hDevice, emFeatureID, &nEntryNum);GX_VERIFY(emStatus);nbufferSize = nEntryNum * sizeof(GX_ENUM_DESCRIPTION);pEnum = new GX_ENUM_DESCRIPTION[nEntryNum];

if (pEnum == NULL){

return;}emStatus = GXGetEnum(m_hDevice, emFeatureID, &nEnumValue);

if (emStatus != GX_STATUS_SUCCESS){

if (pEnum != NULL){

delete []pEnum;pEnum = NULL;

}ShowErrorString(emStatus);return;

}

CString m_strDataTag = L"Test";{

CMFCPropertyGridProperty* pCurObj = new

Page 53: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 52

CMFCPropertyGridProperty(_T("基本信息"), 0, TRUE);{

{CMFCPropertyGridProperty* pProp = new

CMFCPropertyGridProperty(

_T("设备句柄"), (_variant_t) (int)m_hDevice,

_T("设备句柄"));pProp->AllowEdit( FALSE );pCurObj->AddSubItem(pProp);

}{

CMFCPropertyGridProperty* pProp = new CMFCPropertyGridProperty(

_T("图像大小"), (_variant_t) (int)m_nPayLoadSize,

_T("图像大小"));pProp->AllowEdit( FALSE );pCurObj->AddSubItem(pProp);

}{

CMFCPropertyGridProperty* pProp = new CMFCPropertyGridProperty(

_T("图像宽度"), (_variant_t) (int)kernelInterface::s_nCameraImageWidth,

_T("图像宽度"));pProp->AllowEdit( FALSE );pCurObj->AddSubItem(pProp);

}{

CMFCPropertyGridProperty* pProp = new CMFCPropertyGridProperty(

_T("图像高度"), (_variant_t) (int)kernelInterface::s_nCameraImageHeight,

_T("图像高度"));pProp->AllowEdit( FALSE );pCurObj->AddSubItem(pProp);

}}

pCurObj->Expand(FALSE);pGridPropertyCtrl->AddProperty(pCurObj);

}{

Page 54: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 53

int nVal = 10;CMFCPropertyGridProperty* pCurObj = new

CMFCPropertyGridProperty(_T("参数调控"), 0, TRUE);{

GX_STATUS emStatus = GX_STATUS_ERROR;CString strTemp = L"";double dValue = 0.0;GX_FLOAT_RANGE stFloatRange;emStatus = GXGetFloatRange(m_hDevice, GX_FLOAT_EXPOSURE_TIME,

&stFloatRange);GX_VERIFY(emStatus);

if (stFloatRange.dInc == 0){

return;}

kernelInterface::s_kernel_param.m_dShutterInc = stFloatRange.dInc;

nVal = (int)kernelInterface::s_kernel_param.m_dExposure;

strTemp.Format( L" 曝 光 (%.2f~%.2f)%s", stFloatRange.dMin, stFloatRange.dMax, A2W(stFloatRange.szUnit));

CMFCPropertyGridProperty* pProp = new CMFCPropertyGridProperty(

_T("曝光"), (_variant_t) (int)nVal, strTemp );

pProp->EnableSpinControl(TRUE, (int)(stFloatRange.dMin / kernelInterface::s_kernel_param.m_dShutterInc), (int)(stFloatRange.dMax / kernelInterface::s_kernel_param.m_dShutterInc));

pCurObj->AddSubItem(pProp);emStatus = GXSetFloat( m_hDevice, GX_FLOAT_EXPOSURE_TIME,

kernelInterface::s_kernel_param.m_dExposure);}

{GX_STATUS emStatus = GX_STATUS_ERROR;CString strRange = L"";double dGainVal = 0;GX_FLOAT_RANGE stFloatRange;emStatus = GXGetFloatRange(m_hDevice, GX_FLOAT_GAIN,

&stFloatRange);GX_VERIFY(emStatus);

if (stFloatRange.dInc == 0)

Page 55: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 54

{return;

}kernelInterface::s_kernel_param.m_dGainInc = stFloatRange.dInc;nVal = (int)(dGainVal /

kernelInterface::s_kernel_param.m_dGainInc);

strRange.Format( L" 增 益 (%.2f~%.2f)", stFloatRange.dMin, stFloatRange.dMax);

CMFCPropertyGridProperty* pProp = new CMFCPropertyGridProperty(

_T("增益"), (_variant_t) nVal, strRange);

pProp->EnableSpinControl(TRUE, (int)(stFloatRange.dMin/kernelInterface::s_kernel_param.m_dGainInc), (int)(stFloatRange.dMax/kernelInterface::s_kernel_param.m_dGainInc) );

pProp->AllowEdit( TRUE );pCurObj->Expand(TRUE);pCurObj->AddSubItem(pProp);emStatus = GXSetFloat( m_hDevice, GX_FLOAT_GAIN,

kernelInterface::s_kernel_param.m_dGain);}

pGridPropertyCtrl->AddProperty(pCurObj);}{

CString strStatus = L"On";CMFCPropertyGridProperty* pCurObj = new

CMFCPropertyGridProperty(_T("白平衡"), 0, TRUE);{

CMFCPropertyGridProperty* pProp = new CMFCPropertyGridProperty(

_T("自动白平衡"), (_variant_t) strStatus,

_T("自动白平衡:ON or OFF"));InitEnumUI(

GX_ENUM_BALANCE_WHITE_AUTO, pProp, kernelInterface::s_kernel_param.m_nAutoWhiteBalance);

pCurObj->AddSubItem(pProp);}{

CMFCPropertyGridProperty* pProp = new CMFCPropertyGridProperty(

Page 56: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 55

_T("白平衡通道"), (_variant_t) strStatus,

_T("白平衡通道"));InitEnumUI(

GX_ENUM_BALANCE_RATIO_SELECTOR, pProp, kernelInterface::s_kernel_param.m_nRatioSelector);

pProp->AllowEdit( TRUE );pCurObj->AddSubItem(pProp);

}{

GX_STATUS emStatus = GX_STATUS_SUCCESS;double dValue = 0.0;CString strTemp = _T(""), strTemp2 = _T("");;GX_FLOAT_RANGE stFloatRange;emStatus =

GXGetFloatRange(m_hDevice,GX_FLOAT_BALANCE_RATIO,&stFloatRange);GX_VERIFY(emStatus);

strTemp.Format( L" 白 平 衡 系 数 (%.2f~%.2f)",stFloatRange.dMin,stFloatRange.dMax);

emStatus = GXGetFloat(m_hDevice, GX_FLOAT_BALANCE_RATIO, &dValue);

GX_VERIFY(emStatus);

kernelInterface::s_kernel_param.m_dBalanceRatio = dValue;CMFCPropertyGridProperty* pProp = new CMFCPropertyGridProperty(

_T("白平衡系数"), (_variant_t) kernelInterface::s_kernel_param.m_dBalanceRatio, strTemp);

pProp->AllowEdit( TRUE );pCurObj->AddSubItem(pProp);

}pCurObj->Expand(TRUE);pGridPropertyCtrl->AddProperty(pCurObj);

}{

CMFCPropertyGridProperty* pCurObj = new

CMFCPropertyGridProperty(_T("触发控制"), 0, TRUE);{

CMFCPropertyGridProperty* pProp = new CMFCPropertyGridProperty(

Page 57: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 56

_T("触发模式"), (_variant_t) m_strDataTag,

_T("文件头"));InitEnumUI(

GX_ENUM_TRIGGER_MODE, pProp, kernelInterface::s_kernel_param.m_bTriggerMode);

pProp->AllowEdit( FALSE );pCurObj->AddSubItem(pProp);

}{

CMFCPropertyGridProperty* pProp = new CMFCPropertyGridProperty(

_T("触发源"), (_variant_t) m_strDataTag,

_T("文件头"));InitEnumUI(

GX_ENUM_TRIGGER_SOURCE, pProp, kernelInterface::s_kernel_param.m_bTriggerSource);

pProp->AllowEdit( FALSE );pCurObj->AddSubItem(pProp);

}{

CMFCPropertyGridProperty* pProp = new CMFCPropertyGridProperty(

_T("触发极性"), (_variant_t) m_strDataTag,

_T("文件头"));InitEnumUI(

GX_ENUM_TRIGGER_ACTIVATION, pProp, kernelInterface::s_kernel_param.m_bTriggerActive);

pProp->AllowEdit( FALSE );pCurObj->AddSubItem(pProp);

}

pCurObj->AllowEdit( FALSE );pCurObj->Expand(FALSE);pGridPropertyCtrl->AddProperty(pCurObj);

Page 58: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 57

}

if (pEnum != NULL){

delete []pEnum;pEnum = NULL;

}{

GX_STATUS emStatus = GX_STATUS_SUCCESS;emStatus = GXSetEnum( m_hDevice, GX_ENUM_TRIGGER_MODE,

kernelInterface::s_kernel_param.m_bTriggerMode);emStatus = GXSetEnum( m_hDevice, GX_ENUM_TRIGGER_SOURCE,

kernelInterface::s_kernel_param.m_bTriggerSource);emStatus = GXSetEnum( m_hDevice, GX_ENUM_TRIGGER_ACTIVATION,

kernelInterface::s_kernel_param.m_bTriggerActive);

emStatus = GXSetEnum( m_hDevice, GX_ENUM_BALANCE_WHITE_AUTO, kernelInterface::s_kernel_param.m_nAutoWhiteBalance);

emStatus = GXSetEnum( m_hDevice, GX_ENUM_BALANCE_RATIO_SELECTOR, kernelInterface::s_kernel_param.m_nRatioSelector);

emStatus = GXSetFloat( m_hDevice, GX_FLOAT_BALANCE_RATIO, kernelInterface::s_kernel_param.m_dBalanceRatio);

emStatus = GXSetFloat( m_hDevice, GX_FLOAT_EXPOSURE_TIME, kernelInterface::s_kernel_param.m_dExposure);

emStatus = GXSetFloat( m_hDevice, GX_FLOAT_GAIN, kernelInterface::s_kernel_param.m_dGain);

}}void duKernelCamera::ForceUpdate(){

if( !m_bDevOpened )return;

{GX_STATUS emStatus = GX_STATUS_ERROR;int64_t nValue = 0;emStatus = GXSetFloat(m_hDevice,GX_FLOAT_EXPOSURE_TIME,

kernelInterface::s_kernel_param.m_dExposure);}{

GX_STATUS emStatus = GX_STATUS_ERROR;int64_t nValue = 0;

emStatus = GXSetFloat(m_hDevice, GX_FLOAT_GAIN,

Page 59: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 58

kernelInterface::s_kernel_param.m_dGain);}

}void duKernelCamera::UpdateObjFromPropList( CMFCPropertyGridCtrl* pGridPropertyCtrl, CMFCPropertyGridProperty *pGridProperty){

CString name = pGridProperty->GetName();COleVariant oleval = pGridProperty->GetValue();double dChanged;bool bChanged;

if ( name.CompareNoCase( _T("触发模式")) == 0 ){

GX_STATUS emStatus = GX_STATUS_SUCCESS;CString strStatus = oleval.bstrVal;int64_t nEnumVal = (int64_t)pGridProperty->GetData();if( strStatus.CompareNoCase(L"Off") == 0 ){

nEnumVal = GX_TRIGGER_MODE_OFF;}else{

nEnumVal = GX_TRIGGER_MODE_ON;}emStatus = GXSetEnum( m_hDevice, GX_ENUM_TRIGGER_MODE, nEnumVal);

kernelInterface::s_kernel_param.m_bTriggerMode = nEnumVal;}

if ( name.CompareNoCase( _T("触发源")) == 0 ){

GX_STATUS emStatus = GX_STATUS_SUCCESS;CString strStatus = oleval.bstrVal;int64_t nEnumVal = (int64_t)pGridProperty->GetData();if( strStatus.CompareNoCase(L"Software") == 0 ){

nEnumVal = GX_TRIGGER_SOURCE_SOFTWARE;}else{

nEnumVal = GX_TRIGGER_SOURCE_LINE0;}emStatus = GXSetEnum( m_hDevice, GX_ENUM_TRIGGER_SOURCE, nEnumVal);kernelInterface::s_kernel_param.m_bTriggerSource = nEnumVal;

}

Page 60: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 59

if ( name.CompareNoCase( _T("触发极性")) == 0 ){

GX_STATUS emStatus = GX_STATUS_SUCCESS;CString strStatus = oleval.bstrVal;int64_t nEnumVal = (int64_t)pGridProperty->GetData();if( strStatus.CompareNoCase(L"RisingEdge") == 0 ){

nEnumVal = GX_TRIGGER_ACTIVATION_FALLINGEDGE;}else{

nEnumVal = GX_TRIGGER_ACTIVATION_RISINGEDGE;}emStatus = GXSetEnum( m_hDevice, GX_ENUM_TRIGGER_ACTIVATION,

nEnumVal);kernelInterface::s_kernel_param.m_bTriggerActive = nEnumVal;

}

if ( name.CompareNoCase( _T("自动白平衡")) == 0 ){

GX_STATUS emStatus = GX_STATUS_SUCCESS;CString strStatus = oleval.bstrVal;int64_t nEnumVal = (int64_t)pGridProperty->GetData();if( strStatus.CompareNoCase(L"Off") == 0 ){

nEnumVal = GX_BALANCE_WHITE_AUTO_OFF;}else if( strStatus.CompareNoCase(L"Continuous") == 0 ){

nEnumVal = GX_BALANCE_WHITE_AUTO_CONTINUOUS;}else{

nEnumVal = GX_BALANCE_WHITE_AUTO_ONCE;}emStatus = GXSetEnum(m_hDevice, GX_ENUM_BALANCE_WHITE_AUTO,

nEnumVal);GX_VERIFY(emStatus);kernelInterface::s_kernel_param.m_nAutoWhiteBalance = (int)nEnumVal;

}

if ( name.CompareNoCase( _T("白平衡通道")) == 0 ){

GX_STATUS emStatus = GX_STATUS_SUCCESS;CString strStatus = oleval.bstrVal;int64_t nEnumVal = pGridProperty->GetData();

Page 61: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 60

if( strStatus.CompareNoCase(L"Red") == 0 ){

nEnumVal = GX_BALANCE_RATIO_SELECTOR_RED;}else if( strStatus.CompareNoCase(L"Green") == 0 ){

nEnumVal = GX_BALANCE_RATIO_SELECTOR_GREEN;}else{

nEnumVal = GX_BALANCE_RATIO_SELECTOR_BLUE;}emStatus = GXSetEnum(m_hDevice, GX_ENUM_BALANCE_RATIO_SELECTOR,

nEnumVal);kernelInterface::s_kernel_param.m_nRatioSelector = nEnumVal;

}

if ( name.CompareNoCase( _T("白平衡系数")) == 0 ){

kernelInterface::s_kernel_param.m_dBalanceRatio = oleval.dblVal;GX_STATUS emStatus = GX_STATUS_SUCCESS;emStatus =

GXSetFloat(m_hDevice,GX_FLOAT_BALANCE_RATIO,kernelInterface::s_kernel_param.m_dBalanceRatio);

}

if ( name.CompareNoCase( _T("曝光")) == 0 ){

GX_STATUS emStatus = GX_STATUS_ERROR;int64_t nValue = 0;nValue = oleval.intVal;

kernelInterface::s_kernel_param.m_dExposure = nValue * kernelInterface::s_kernel_param.m_dShutterInc;

emStatus = GXSetFloat(m_hDevice,GX_FLOAT_EXPOSURE_TIME, kernelInterface::s_kernel_param.m_dExposure);

}

if ( name.CompareNoCase( _T("增益")) == 0 ){

GX_STATUS emStatus = GX_STATUS_ERROR;int64_t nValue = 0;nValue = oleval.intVal;kernelInterface::s_kernel_param.m_dGain = nValue *

kernelInterface::s_kernel_param.m_dGainInc;emStatus = GXSetFloat(m_hDevice, GX_FLOAT_GAIN,

kernelInterface::s_kernel_param.m_dGain);

Page 62: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 61

}

return ;}BOOL duKernelCamera::OpenDevice(){

GX_STATUS emStatus = GX_STATUS_SUCCESS;uint32_t nDevNum = 0;GX_OPEN_PARAM stOpenParam;stOpenParam.accessMode = GX_ACCESS_EXCLUSIVE;stOpenParam.openMode = GX_OPEN_INDEX;stOpenParam.pszContent = "1";emStatus = GXUpdateDeviceList(&nDevNum, 1000);if (emStatus != GX_STATUS_SUCCESS){

return FALSE;}if (nDevNum <= 0){

return FALSE;}emStatus = GXOpenDevice(&stOpenParam, &m_hDevice);if (emStatus != GX_STATUS_SUCCESS){

return FALSE;}m_bDevOpened = TRUE;emStatus = InitDevice();if (emStatus != GX_STATUS_SUCCESS){

return FALSE;}emStatus = GetDeviceParam();if (emStatus != GX_STATUS_SUCCESS){

return FALSE;}GetImageImproveParam();kernelInterface::s_kernel_param.UpdateDataAccordingToCam();return TRUE;

}

BOOL duKernelCamera::StartCapture(){

Page 63: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 62

GX_STATUS emStatus = GX_STATUS_ERROR;if( m_bIsSnap ){

StopCapture();}if (! PrepareForShowImg()){

AfxMessageBox(L"为图像显示分配资源失败!");return FALSE;

}emStatus = GXRegisterCaptureCallback((GX_DEV_HANDLE)m_hDevice, this,

OnFrameCallbackFun);if (emStatus != GX_STATUS_SUCCESS){

UnPrepareForShowImg();ShowErrorString(emStatus);return FALSE;

}emStatus = GXSendCommand((GX_DEV_HANDLE)m_hDevice,

GX_COMMAND_ACQUISITION_START);if (emStatus != GX_STATUS_SUCCESS){

UnPrepareForShowImg();ShowErrorString(emStatus);return FALSE;

}m_bIsSnap = TRUE;return TRUE;

}BOOL duKernelCamera::StopCapture(){

GX_STATUS emStatus = GX_STATUS_SUCCESS;emStatus = GXSendCommand((GX_DEV_HANDLE)m_hDevice,

GX_COMMAND_ACQUISITION_STOP);if (emStatus != GX_STATUS_SUCCESS)

return FALSE;emStatus = GXUnregisterCaptureCallback((GX_DEV_HANDLE)m_hDevice);if (emStatus != GX_STATUS_SUCCESS)

return FALSE;return TRUE;m_bIsSnap = FALSE;

UnPrepareForShowImg();

Page 64: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 63

}GX_STATUS duKernelCamera::InitDevice(){

GX_STATUS emStatus = GX_STATUS_SUCCESS;emStatus = GXSetEnum(m_hDevice,GX_ENUM_ACQUISITION_MODE,

GX_ACQ_MODE_CONTINUOUS);VERIFY_STATUS_RET(emStatus);emStatus = SetPixelFormat8bit(); return emStatus;

}GX_STATUS duKernelCamera::SetPixelFormat8bit(){

GX_STATUS emStatus = GX_STATUS_SUCCESS;int64_t nPixelSize = 0;uint32_t nEnmuEntry = 0;size_t nBufferSize = 0;BOOL bIs8bit = TRUE;GX_ENUM_DESCRIPTION *pEnumDescription = NULL;GX_ENUM_DESCRIPTION *pEnumTemp = NULL;emStatus = GXGetEnum(m_hDevice, GX_ENUM_PIXEL_SIZE, &nPixelSize);VERIFY_STATUS_RET(emStatus);if (nPixelSize == GX_PIXEL_SIZE_BPP8){

return GX_STATUS_SUCCESS;}else{

emStatus = GXGetEnumEntryNums(m_hDevice, GX_ENUM_PIXEL_FORMAT, &nEnmuEntry);

VERIFY_STATUS_RET(emStatus);nBufferSize = nEnmuEntry * sizeof(GX_ENUM_DESCRIPTION);pEnumDescription = new GX_ENUM_DESCRIPTION[nEnmuEntry];emStatus = GXGetEnumDescription(m_hDevice,

GX_ENUM_PIXEL_FORMAT, pEnumDescription, &nBufferSize);if (emStatus != GX_STATUS_SUCCESS){

if (pEnumDescription != NULL){

delete []pEnumDescription;pEnumDescription = NULL;

}

return emStatus;}

Page 65: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 64

for (uint32_t i = 0; i<nEnmuEntry; i++){

if ((pEnumDescription[i].nValue & GX_PIXEL_8BIT) == GX_PIXEL_8BIT)

{emStatus = GXSetEnum(m_hDevice, GX_ENUM_PIXEL_FORMAT,

pEnumDescription[i].nValue);break;

}}if (pEnumDescription != NULL){

delete []pEnumDescription;pEnumDescription = NULL;

}}

return emStatus;}GX_STATUS duKernelCamera::GetDeviceParam(){

GX_STATUS emStatus = GX_STATUS_ERROR;bool bColorFliter = false;

int64_t nImageHeight; ///< 原始图像高int64_t nImageWidth; ///< 原始图像宽emStatus = GXGetInt(m_hDevice, GX_INT_PAYLOAD_SIZE, &m_nPayLoadSize);VERIFY_STATUS_RET(emStatus);emStatus = GXGetInt(m_hDevice, GX_INT_WIDTH, &nImageWidth);VERIFY_STATUS_RET(emStatus);bool bsupported = kernelInterface::s_kernel_param.m_bColorFilter;emStatus = GXIsImplemented(m_hDevice, GX_ENUM_PIXEL_COLOR_FILTER, &

bsupported); kernelInterface::s_kernel_param.m_bColorFilter = bsupported;VERIFY_STATUS_RET(emStatus);if (kernelInterface::s_kernel_param.m_bColorFilter){

emStatus = GXGetEnum(m_hDevice, GX_ENUM_PIXEL_COLOR_FILTER, &m_nPixelColorFilter);

VERIFY_STATUS_RET(emStatus);}bsupported = kernelInterface::s_kernel_param.m_bBalanceRatioSelector; emStatus = GXIsImplemented(m_hDevice, GX_ENUM_BALANCE_RATIO_SELECTOR, &

bsupported); kernelInterface::s_kernel_param.m_bColorFilter = bsupported;VERIFY_STATUS_RET(emStatus);emStatus = GXGetInt(m_hDevice, GX_INT_HEIGHT, &nImageHeight);

Page 66: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 65

kernelInterface::s_nCameraImageHeight = nImageHeight;kernelInterface::s_nCameraImageWidth = nImageWidth;

return emStatus;}void duKernelCamera::GetImageImproveParam(){

if (!kernelInterface::s_kernel_param.m_bColorFilter){

return;}

GX_STATUS emStatus = GX_STATUS_SUCCESS;VxInt32 nStatus = DX_OK;emStatus = GXGetInt(m_hDevice, GX_INT_CONTRASTPARAM, &m_nContrast);if (emStatus != GX_STATUS_SUCCESS){

return ;}emStatus = GXGetInt(m_hDevice, GX_INT_COLORCORRECTIONPARAM,

&m_nColorCorrection);if (emStatus != GX_STATUS_SUCCESS){

return ;}emStatus = GXGetFloat(m_hDevice, GX_FLOAT_GAMMAPARAM,

&kernelInterface::s_kernel_param.m_dGamma);if (emStatus != GX_STATUS_SUCCESS){

return ;}do {

nStatus = DxGetGammatLut(kernelInterface::s_kernel_param.m_dGamma, NULL, &m_nLutLength);

if (nStatus != DX_OK){

break;}m_pGammaLut = new BYTE[m_nLutLength];if (m_pGammaLut == NULL){

nStatus = DX_NOT_ENOUGH_SYSTEM_MEMORY;break;

Page 67: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 66

}nStatus = DxGetGammatLut(kernelInterface::s_kernel_param.m_dGamma,

m_pGammaLut, &m_nLutLength);if (nStatus != DX_OK){

break;}nStatus =

DxGetContrastLut((int)kernelInterface::s_kernel_param.m_nContrast, NULL, &m_nLutLength);

if (nStatus != DX_OK){

break;}m_pContrastLut = new BYTE[m_nLutLength];if (m_pContrastLut == NULL){

nStatus = DX_NOT_ENOUGH_SYSTEM_MEMORY;break;

}nStatus =

DxGetContrastLut((int)kernelInterface::s_kernel_param.m_nContrast, m_pContrastLut, &m_nLutLength);

if (nStatus != DX_OK){

break;}

} while (0);if (nStatus != DX_OK){

if (m_pGammaLut != NULL){

delete[] m_pGammaLut;m_pGammaLut = NULL;

}if (m_pContrastLut != NULL){

delete[] m_pContrastLut;m_pContrastLut = NULL;

}return;

}}BOOL duKernelCamera::CloseDevice()

Page 68: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 67

{GX_STATUS emStatus = GX_STATUS_SUCCESS;if (m_bIsSnap){

emStatus = GXSendCommand(m_hDevice, GX_COMMAND_ACQUISITION_STOP);if (emStatus != GX_STATUS_SUCCESS){

return FALSE;}emStatus = GXUnregisterCaptureCallback(m_hDevice);if (emStatus != GX_STATUS_SUCCESS){

return FALSE;}m_bIsSnap = FALSE;UnPrepareForShowImg();

}emStatus = GXCloseDevice(m_hDevice);if (emStatus != GX_STATUS_SUCCESS){

return FALSE;}m_bDevOpened = FALSE;m_hDevice = NULL;if (m_pGammaLut != NULL){

delete[] m_pGammaLut;m_pGammaLut = NULL;

}if (m_pContrastLut != NULL){

delete[] m_pContrastLut;m_pContrastLut = NULL;

}return TRUE;

}void duKernelCamera::InitEnumUI(GX_FEATURE_ID emFeatureID, CComboBox *pComboBox, bool bIsImplement){

USES_CONVERSION;if ((pComboBox == NULL) || !bIsImplement){

return;}

Page 69: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 68

GX_ENUM_DESCRIPTION *pEnum = NULL;GX_STATUS emStatus = GX_STATUS_ERROR;size_t nbufferSize = 0;uint32_t nEntryNum = 0;int64_t nEnumValue = -1;int nCursel = 0;double dValue = 0;emStatus = GXGetEnumEntryNums(m_hDevice, emFeatureID, &nEntryNum);GX_VERIFY(emStatus);nbufferSize = nEntryNum * sizeof(GX_ENUM_DESCRIPTION);pEnum = new GX_ENUM_DESCRIPTION[nEntryNum];if (pEnum == NULL){

return;}

emStatus = GXGetEnumDescription(m_hDevice, emFeatureID, pEnum, &nbufferSize);

if (emStatus != GX_STATUS_SUCCESS){

if (pEnum != NULL){

delete []pEnum;pEnum = NULL;

}ShowErrorString(emStatus);return;

}emStatus = GXGetEnum(m_hDevice, emFeatureID, &nEnumValue);if (emStatus != GX_STATUS_SUCCESS){

if (pEnum != NULL){

delete []pEnum;pEnum = NULL;

}ShowErrorString(emStatus);return;

}pComboBox->ResetContent();for (uint32_t i = 0; i < nEntryNum; i++){

pComboBox->SetItemData(pComboBox->AddString( A2W(pEnum[i].szSymbolic) ), (uint32_t)pEnum[i].nValue);

Page 70: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 69

if (pEnum[i].nValue == nEnumValue){

nCursel = i;}

}pComboBox->SetCurSel(nCursel);if (pEnum != NULL){

delete []pEnum;pEnum = NULL;

}}bool duKernelCamera::PrepareForShowImg(){

m_pBmpInfo = (BITMAPINFO *)m_chBmpBuf;m_pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);m_pBmpInfo->bmiHeader.biWidth =

(LONG)kernelInterface::s_nCameraImageWidth;m_pBmpInfo->bmiHeader.biHeight =

(LONG)kernelInterface::s_nCameraImageHeight;

m_pBmpInfo->bmiHeader.biPlanes = 1;m_pBmpInfo->bmiHeader.biBitCount = 24;m_pBmpInfo->bmiHeader.biCompression = BI_RGB;m_pBmpInfo->bmiHeader.biSizeImage = 0;m_pBmpInfo->bmiHeader.biXPelsPerMeter = 0;m_pBmpInfo->bmiHeader.biYPelsPerMeter = 0;m_pBmpInfo->bmiHeader.biClrUsed = 0;m_pBmpInfo->bmiHeader.biClrImportant = 0;m_pBufferRGB = new BYTE[(size_t)(kernelInterface::s_nCameraImageWidth *

kernelInterface::s_nCameraImageHeight * 3)];if (m_pBufferRGB == NULL){

return false;}m_pBufferRaw = new BYTE[(size_t)m_nPayLoadSize];if (m_pBufferRaw == NULL){

delete []m_pBufferRGB;m_pBufferRGB = NULL;return false;

}return true;

}

Page 71: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 70

void duKernelCamera::UnPrepareForShowImg(){

if (m_pBufferRGB != NULL){

delete []m_pBufferRGB;m_pBufferRGB = NULL;

}if (m_pBufferRaw != NULL){

delete []m_pBufferRaw;m_pBufferRaw = NULL;

}}CString duKernelCamera::SaveImage(CString strFileName) {

DWORD dwImageSize = (DWORD)(kernelInterface::s_nCameraImageWidth * kernelInterface::s_nCameraImageHeight * 3);

BITMAPFILEHEADER stBfh = {0};DWORD dwBytesRead = 0;SYSTEMTIME sysTime;if( strFileName.CompareNoCase( _T("")) == 0 ){

GetLocalTime(&sysTime);strFileName.Format( L"%s\\old_Captured%.4d_%.2d_%.2d_%.2d_%.2d_%.2d_

%.3d.bmp", kernelInterface::s_kernel_param.m_strWorkPathName,sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute,sysTime.wSecond,sysTime.wMilliseconds);

}stBfh.bfType = (WORD)'M' << 8 | 'B';stBfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);stBfh.bfSize = stBfh.bfOffBits + dwImageSize; HANDLE hFile = ::CreateFile(strFileName,

GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,

Page 72: @file base: VKObject.h 单一绘制图元基类 **/10.1007/s110…  · Web viewIplImage* pSubObject, CvPoint pt1, CvPoint pt2, double & dScale, double & dMaxArea,

Maize Kernel Measurement software 71

NULL);if (hFile != INVALID_HANDLE_VALUE) {

::WriteFile(hFile, &stBfh, sizeof(BITMAPFILEHEADER), &dwBytesRead, NULL);

::WriteFile(hFile, m_pBmpInfo, sizeof(BITMAPINFOHEADER), &dwBytesRead, NULL);

::WriteFile(hFile, m_pBufferRGB, dwImageSize, &dwBytesRead, NULL);

CloseHandle(hFile);}return strFileName;

}

BOOL duKernelCamera::SaveKernelImage( CString strImage ){

USES_CONVERSION;if( !m_pBufferRGB )

return FALSE;

IplImage* iplImage = cvCreateImageHeader(cvSize(kernelInterface::s_nCameraImageWidth,kernelInterface::s_nCameraImageHeight),

IPL_DEPTH_8U,3);

cvSetData(iplImage, m_pBufferRGB,3*kernelInterface::s_nCameraImageWidth);

CvRect rcROI;rcROI.x = 0;rcROI.y = 0;rcROI.width = kernelInterface::s_nCameraImageWidth;rcROI.height = kernelInterface::s_nCameraImageHeight;cvSetImageROI( iplImage, rcROI );cvSaveImage( W2A(strImage), iplImage );cvReleaseImageHeader( &iplImage );return TRUE;

}