程式可控制的參數例如圖像尺寸(ROI)、拍照、曝光時間、GAMMA、對比差、亮度、自定義LUT、鏡頭翻轉、RGB顏色增益、飽和度、銳度、彩色轉黑白、色溫校正、反色、9組十字線位置和顏色、觸發模式、幀率控制,有附SDK及C#、C++ Builder、Delphi、labView、QT5、VB、VC等範例可參考,對於喜歡寫自動控制程式的人來說非常方便。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
usingSystem.Windows.Forms;
usingSystem.Runtime.InteropServices;
usingSystem.Threading;
usingCameraHandle = System.IntPtr;
usingCKSDK;
usingCKAPI = CKSDK.CKSDKAPI;
namespacePlayer
{
public partial class mainwindow: Form
{
#
regionvariable
protectedCameraHandle m_hCamera = IntPtr.Zero; // 句柄
protectedThread m_CapThread;
protected boolm_bExit = false;
protected uintm_uWidth = 0;
protected uintm_uHeight = 0;
doublem_CapFrameRate = 0;
doublem_DisFrameRate = 0;
#
endregion
public mainwindow()
{
InitializeComponent();
CameraRefresh();
}
public voidCaptureThreadFunction()
{
stImageInfo ImageInfo = newstImageInfo();
CameraSdkStatus status = CameraSdkStatus.CAMERA_STATUS_SUCCESS;
IntPtr pRGBFrame = IntPtr.Zero;
uintDispFrameNum = 0;
intFrameTimeCur = 0;
intFrameTimeLast = 0;
FrameStatistic curFS = newFrameStatistic();
FrameStatistic lastFS = newFrameStatistic();
IntPtr pbyBuffer = IntPtr.Zero;
uintdRGBBufLen = 0;
CameraHandle hBuf = IntPtr.Zero;
CKAPI.CameraPlay(m_hCamera);
while(!m_bExit)
{
CKAPI.CameraGetFrameStatistic(m_hCamera, outcurFS);
if(FrameTimeCur != 0)
{
FrameTimeCur = Environment.TickCount;
intdeltime = FrameTimeCur - FrameTimeLast;
if(1000 <= deltime)
{
m_CapFrameRate = (double)(((double)curFS.iCapture - (double)lastFS.iCapture) * 1000.0) / deltime;
m_DisFrameRate = (double)DispFrameNum * 1000.0 / deltime;
lastFS = curFS;
FrameTimeLast = FrameTimeCur;
DispFrameNum = 0;
}
}
else
{
FrameTimeCur = Environment.TickCount;
FrameTimeLast = FrameTimeCur;
lastFS = curFS;
}
//获取 RAW 数据
status = CKAPI.CameraGetRawImageBuffer(m_hCamera, refhBuf, 1000);
if(status != CameraSdkStatus.CAMERA_STATUS_SUCCESS)
{
Thread.Sleep(5);
continue;
}
//获得图像缓冲区地址
pbyBuffer = CKAPI.CameraGetImageInfo(m_hCamera, hBuf, refImageInfo);
//获得经 ISP 处理的 RGB 数据
//////////////////////////////////
if(dRGBBufLen < (ImageInfo.iWidth * ImageInfo.iHeight * 4))
{
dRGBBufLen = (ImageInfo.iWidth * ImageInfo.iHeight * 4);
pRGBFrame = Marshal.AllocHGlobal(Convert.ToInt32(dRGBBufLen));
}
m_uWidth = ImageInfo.iWidth;
m_uHeight = ImageInfo.iHeight;
CKAPI.CameraGetOutImageBuffer(m_hCamera, refImageInfo, pbyBuffer, pRGBFrame);
DispFrameNum++;
//////////////////////////////////显示
CKAPI.CameraDisplay(m_hCamera, pRGBFrame, refImageInfo);
//释放由 CameraGetRawImageBuffer 获得的缓冲区
CKAPI.CameraReleaseFrameHandle(m_hCamera, hBuf);
}
CKAPI.CameraPause(m_hCamera);
}
private voidCameraRefresh()
{
// 清空设备combobox
this.comboBox_DeviceList.Items.Clear();
CameraSdkStatus status;
//tSdkCameraDevInfo[] tCameraDevInfoList;
intdevNum = 0;
status = CKAPI.CameraEnumerateDevice(refdevNum);
if(status != CameraSdkStatus.CAMERA_STATUS_SUCCESS)
return;
for(inti = 0; i < devNum; i++)
{
tDevEnumInfo devAllInfo;
// 获取设备信息
status = CKAPI.CameraGetEnumIndexInfo(i, outdevAllInfo);
if(status != CameraSdkStatus.CAMERA_STATUS_SUCCESS)
continue;
// 将设备昵称增加到combobox控件中。
this.comboBox_DeviceList.Items.Add(new string(devAllInfo.DevAttribute.acFriendlyName));
}
if(devNum > 0)
this.comboBox_DeviceList.SelectedIndex = 0;
}
private voidCameraSetting()
{
if(m_hCamera != IntPtr.Zero)
{
if(CKAPI.CameraSetActivePage(m_hCamera, emSettingPage.SETTING_PAGE_ALL, 0) != CameraSdkStatus.CAMERA_STATUS_SUCCESS)
return;
if(CKAPI.CameraCreateSettingPageEx(m_hCamera) != CameraSdkStatus.CAMERA_STATUS_SUCCESS)
return;
CKAPI.CameraShowSettingPage(m_hCamera, 1);
}
}
private boolCameraPlay()
{
// 先停止当前的播放,然后再打开新的播放设备
CameraStop();
intindex = this.comboBox_DeviceList.SelectedIndex;
if(index < 0)
return false;
// 初始化设备,返回设备句柄
CameraSdkStatus status = CKAPI.CameraInit(refm_hCamera, index);
if(status != CameraSdkStatus.CAMERA_STATUS_SUCCESS)
{
m_hCamera = IntPtr.Zero;
return false;
}
// 初始化播放显示,设置显示图像的控件句柄
status = CKAPI.CameraDisplayInit(m_hCamera, this.pictureBox.Handle);
if(status != CameraSdkStatus.CAMERA_STATUS_SUCCESS)
{
CKAPI.CameraUnInit(m_hCamera);
m_hCamera = IntPtr.Zero;
return false;
}
// 新建视频播放线程
m_bExit = false;
m_CapThread = newThread(newThreadStart(CaptureThreadFunction));
m_CapThread.Start();
return true;
}
private voidCameraStop()
{
// 先关闭线程
if(m_CapThread != null)
{
m_bExit = true;
while(m_CapThread.IsAlive)
Thread.Sleep(10);
m_CapThread = null;
}
// 关闭相机句柄
if(m_hCamera != IntPtr.Zero)
{
CKAPI.CameraUnInit(m_hCamera);
m_hCamera = IntPtr.Zero;
}
}
private voidbutton_Refresh_Click(objectsender, EventArgs e)
{
CameraRefresh();
}
private voidbutton_PlayOrStop_Click(objectsender, EventArgs e)
{
if(this.button_PlayOrStop.Text == "Play")
{
if(CameraPlay())
{
this.button_PlayOrStop.Text = "Stop";
this.button_Setting.Enabled = true;
this.timer_DevInfo.Start();
}
}
else
{
CameraStop();
this.button_PlayOrStop.Text = "Play";
this.button_Setting.Enabled = false;
this.timer_DevInfo.Stop();
}
}
private voidbutton_Setting_Click(objectsender, EventArgs e)
{
CameraSetting();
}
private voidtimer_DevInfo_Tick(objectsender, EventArgs e)
{
this.label_DevInfo.Text = string.Format("resolution: {0} x {1} | capture frame rate: {2:###.##} | display frame rate: {3:###.##}",
m_uWidth, m_uHeight, m_CapFrameRate, m_DisFrameRate);
}
private voidForm1_FormClosing(objectsender, FormClosingEventArgs e)
{
CameraStop();
}
}
}
翻譯年糕