大胸弟:來都來了,不點點關注,不點點贊 ,您是不是有點太不講武德了!
1. 用opencv預覽筆記本攝像頭時,不像ipc/或者工業相機一樣,有可呼叫的白平衡介面,
相機的自動白平衡就是要通過改變RGB感光電路信號的放大比例,讓受環境光影響的白色還原成純白色,保證在各種光線條件下,成像色彩跟物體真實的色彩保持一致,
常用的一種自動白平衡演算法是灰度世界法,它假設對于一副色彩豐富的影像,影像上RGB三個分量的平均值趨于同一個灰度值,一般取這個灰度值的大小為RGB三分量的平均值,
我們先來看一組圖片:
1.

2.

3.

4.

以上這些圖都是 R G B 三通道的白平衡值 相差很大導致,我們需要去調整均值, 以保證保存的圖片看上去基本一致!
如海康工業相機 白平衡 介面如下:
nRet = pcurCam->GetEnumValue("BalanceWhiteAuto", &stEnumValue);
if (MV_OK == nRet)
{
m_BalanceWhiteAutoCombox.SetCurSel(stEnumValue.nCurValue);
}
if (stEnumValue.nCurValue == 0)
{
//int red = atof(T2A(m_strRed));
//int green = atof(T2A(m_strGain));
//int blue = atof(T2A(m_strGain));
pcurCam->SetEnumValue("BalanceRatioSelector",0);
pcurCam->GetIntValue("BalanceRatio", &m_CurCamRed);
m_strRed.Format(_T("%d"), m_CurCamRed.nCurValue);
AddToolTip2Ctrl_Int(IDC_red_balance, m_CurCamRed.nMin, m_CurCamRed.nMax);
pcurCam->SetEnumValue("BalanceRatioSelector", 1);
pcurCam->GetIntValue("BalanceRatio", &m_CurCamGreen);
m_strgreen.Format(_T("%d"), m_CurCamGreen.nCurValue);
AddToolTip2Ctrl_Int(IDC_green_balance, m_CurCamGreen.nMin, m_CurCamGreen.nMax);
pcurCam->SetEnumValue("BalanceRatioSelector", 2);
pcurCam->GetIntValue("BalanceRatio", &m_CurCamBlue);
m_strblue.Format(_T("%d"), m_CurCamBlue.nCurValue);
AddToolTip2Ctrl_Int(IDC_blue_balance, m_CurCamBlue.nMin, m_CurCamBlue.nMax);
}
那么 系統筆記本的攝像頭就必須自己去實作這個功能了:
void CITCFreeTouchDlg::Take_PIc()
{
string str = "take picture start!";
CLogHelp::ITCLog(str);
//Sleep(100);
if (m_bPriview)
{
//string strtempsavefile = GeneateImagepath(0, m_priviewid);
//if (imwrite(strtempsavefile.c_str(), g_srcImage))
//{
// CLogHelp::ITCLog("Temp save take_picture,,,");
// DeleteFile(strtempsavefile.c_str());
//}
m_CurrentpicSaveImage = GeneateImagepath(0, m_priviewid);
EnterCriticalSection(&m_cs);
Mat save_srcImage = g_srcImage.clone();
LeaveCriticalSection(&m_cs);
BOOL bwirte = FALSE;
//EnterCriticalSection(&m_cs);
//bwirte = m_CvvImage.SaveEx(m_CurrentpicSaveImage.c_str());
//LeaveCriticalSection(&m_cs);
if (AutoWhiteBalance > 0)
{
vector<Mat> imageRGB;
//RGB三通道分離
split(save_srcImage, imageRGB);
//求原始影像的RGB分量的均值
double R, G, B;
B = mean(imageRGB[0])[0];
G = mean(imageRGB[1])[0];
R = mean(imageRGB[2])[0];
//需要調整的RGB分量的增益
double KR, KG, KB;
KB = (R + G + B) / (3 * B);
KG = (R + G + B) / (3 * G);
KR = (R + G + B) / (3 * R);
//調整RGB三個通道各自的值
imageRGB[0] = imageRGB[0] * KB;
imageRGB[1] = imageRGB[1] * KG;
imageRGB[2] = imageRGB[2] * KR;
//RGB三通道影像合并
merge(imageRGB, save_srcImage);
}
vector<int> compression_params;
switch (SaveImageFmt)
{
case 0:
break;
case 1:
{
compression_params.push_back(CV_IMWRITE_JPEG_QUALITY); //選擇jpeg
compression_params.push_back(100); //在這個填入你要的圖片質量
//string str = "take picture adjust jpg quality!";
//CLogHelp::ITCLog(str);
}
break;
case 2:
{
compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION); //PNG格式圖片的壓縮級別
compression_params.push_back(9); //這里設定保存的影像質量級別
//string str = "take picture adjust png quality!";
//CLogHelp::ITCLog(str);
}
break;
default:
break;
}
//BOOL bwirte = FALSE;
if (SaveImageFmt == 0)
{
bwirte = imwrite(m_CurrentpicSaveImage.c_str(), save_srcImage);
}
else
{
bwirte = imwrite(m_CurrentpicSaveImage.c_str(), save_srcImage, compression_params);
}
if (!bwirte)
{
string str = "take_picture fail!";
int len = str.size();
int snlen = len + 2;
SendCMDACKMsg(str, snlen);
CLogHelp::ITCLog(str);
return;
}
else
{
string str = "take picture Success!";
CLogHelp::ITCLog(str);
}
if (!m_brecvFTPupload)
{
string str = "error not recv FTPupload url!";
int len = str.size();
int snlen = len + 2;
SendCMDACKMsg(str, snlen);
CLogHelp::ITCLog(str);
return;
}
Sleep(10);
DWORD startftptime = GetTickCount();
while (true)
{
if (!FindFtpPrecess("ftp.exe"))
{
break;
}
else
{
DWORD endtime = GetTickCount();
if ((endtime - startftptime) > 5000)
{
break;
}
else
{
Sleep(500);
}
}
}
CreateThread(NULL, 0, FTPUploadThreadProc, this, 0, NULL);//創建新執行緒
CLogHelp::ITCLog("FTPUploadThreadProc start !");
return;
}
}
大胸弟:文章都看完了,不點點關注,不點點贊 ,您是不是有點太不講武德了! 
CSDN認證博客專家
C/C++
vc/qt
音視頻
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/227595.html
標籤:其他
上一篇:編碼實作楊輝三角
