【映像演算法】彩色映像分割專題一:顯示螢幕上任意點的顏色值
SkySeraph May 13rd 2011 HQU
Email:zgzhaobo@gmail.com QQ:452728574
Latest Modified Date:May 13rd 2011 HQU
》說明:
1 分析彩色映像時,不同空間的選擇,需要即時知道映像上某點的顏色值,參考網上相關資料,實現即時顯示螢幕上任意點的RGB/HSV/YIQ值,當然還可以是其它色彩空間的值,原理類似沒在重複。
2 關於色彩空間相關知識,請參考:
http://www.cnblogs.com/skyseraph/archive/2011/05/03/2035643.html
http://www.cnblogs.com/skyseraph/archive/2011/05/05/2038317.html
http://www.cnblogs.com/skyseraph/archive/2011/05/05/2038308.html
3 類似軟體
http://www.broadhurst-family.co.uk/lefteye/MainPages/Lab.htm RGB/Lab/HSV軟體
》實現(源碼):
響應函數
//////////////////////////////////////////////////////////////////////////void CColorSegDlg::OnFetchColor() // 擷取螢幕上任意點的RGB值並顯示{ m_bSnapFlag^=TRUE; if (m_bSnapFlag) //開啟螢幕取色 { m_ColorPicker.SetWindowText("Stop Fetch"); SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); SetTimer(1, 80, NULL); //80ms觸發一次定時器 } else { m_ColorPicker.SetWindowText("Start Fetch"); SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); KillTimer(1); }//註:另一種方法:不採用bool標記m_bSnapFlag,//採用if(m_ColorPicker.GetCheck()) 但這種方法不能實現菜單的控制}
Time函數
void CColorSegDlg::OnTimer(UINT nIDEvent) {if (nIDEvent != 1) return; CPoint pt; GetCursorPos(&pt); HDC hDC = ::GetDC(NULL); COLORREF clr = ::GetPixel(hDC, pt.x, pt.y);int R=GetRValue(clr);int G=GetGValue(clr);int B=GetBValue(clr); // 輸出RGB值CString ClrText; ClrText.Format("%d",R);//GetRValue(clr)m_EditRed.SetWindowText(ClrText);ClrText.Format("%d",G);//GetGValue(clr)m_EditGreen.SetWindowText(ClrText);ClrText.Format("%d",B);//GetBValue(clr)m_EditBlue.SetWindowText(ClrText);CString cs;// HSVdouble hsvH,hsvS,hsvV;pMyColorSpace.MyRGB2HSV(R,G,B,hsvH,hsvS,hsvV,1);// 輸出HSV值cs.Format("%.3f",hsvH);GetDlgItem(IDC_H)->SetWindowText(cs);cs.Format("%.3f",hsvS);GetDlgItem(IDC_S)->SetWindowText(cs);cs.Format("%.3f",hsvV);GetDlgItem(IDC_V)->SetWindowText(cs);// YUV && YIQdouble yuvY,yuvU,yuvV,yiqY,yiqI,yiqQ;pMyColorSpace.MyRGB2YUV(R,G,B,yuvY,yuvU,yuvV);pMyColorSpace.MyRGB2YIQ(R,G,B,yiqY,yiqI,yiqQ);//int nTH=int(atan(fabs(yuvV/yuvU))*180.0/3.1415926);// 輸出YIQ值cs.Format("%.3f",yiqQ);GetDlgItem(IDC_yiqQ)->SetWindowText(cs);cs.Format("%.3f",yiqI);GetDlgItem(IDC_yiqI)->SetWindowText(cs);cs.Format("%.3f",yiqY);GetDlgItem(IDC_yiqY)->SetWindowText(cs);// 顯示地區CRect m_rect;m_Color.GetClientRect(m_rect);CDC* dc = m_Color.GetDC();CBrush m_brush(RGB(GetRValue(clr),GetGValue(clr),GetBValue(clr)));dc->FillRect(m_rect,&m_brush); ::ReleaseDC(NULL, hDC);CDialog::OnTimer(nIDEvent);}
》效果
完整介面見:
http://www.cnblogs.com/skyseraph/archive/2011/05/05/2038308.html
Author: SKySeraph
Email/GTalk: zgzhaobo@gmail.com QQ:452728574
From: http://www.cnblogs.com/skyseraph/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,請尊重作者的勞動成果