今天沒事看到家里有一款海康的網絡攝像頭,這個攝像頭支持上下左右旋轉,另外還可以鏡頭遠近縮放。剛好家里又有一款搖桿和一個北通的手柄。想着寫一個軟件實現用手柄和搖桿控制攝像頭運動,
還能將實時畫面顯示在軟件上,最后做出來的效果還是不錯的。大概介紹一下這個軟件的開發情況,先附上資料。
資料下載:
鏈接:https://pan.baidu.com/s/1awF_PagiqMkbfHJjwvb11g 提取碼:1234
開發軟件:qt5.14.2 (MinGw64)
開發語言:c++
測試搖桿:圖馬斯特(其它xbox搖桿也可以) 鏈接:http://support.thrustmaster.cn/zh/product/t-flight-hotas-one-zh
測試手柄:北通阿修羅2-無線版
攝像頭:海康網絡攝像頭
效果展示:
- 軟件主界面
視頻展示:
軟件介紹:
1.軟件右邊是搖桿或手柄鍵位撥動時讀出的數值。
2.中間部分是手動用鼠標控制攝像頭運動,或登錄參數設置。
3.左邊實時畫面。
部分代碼:
手柄類:
class joystick:public QObject { public: joystick()=delete; joystick(QVector<QPushButton*>&btn,QTextEdit *edit,QProgressBar *rpos,QProgressBar *zpos); ~joystick(); void Joyinit(); void joyInfoUpdate(); void joyBtnStateClear(void); bool readJoyActInfo(JOYINFOEX &info); private: JOYINFOEX now_act; QVector<QPushButton*>joyBtnList; QTextEdit *textEdit; QProgressBar *joy_dwRpos; QProgressBar *joy_dwZpos; }; #endif // joystick
void joystick::joyInfoUpdate() { QString str; now_act.dwSize = sizeof(typeof(joyinfoex_tag)); now_act.dwFlags = (int)JOY_RETURNBUTTONS; qJoyGetPosEx(JSX, &now_act); str.append("dwSize=").append(QString::number(now_act.dwSize)).append("\n"); str.append("dwFlags=").append(QString::number(now_act.dwFlags)).append("\n"); str.append("dwXpos=").append(QString::number(now_act.dwXpos)).append("\n"); str.append("dwYpos=").append(QString::number(now_act.dwYpos)).append("\n"); str.append("dwZpos=").append(QString::number(now_act.dwZpos)).append("\n"); str.append("dwRpos=").append(QString::number(now_act.dwRpos)).append("\n"); str.append("dwUpos=").append(QString::number(now_act.dwUpos)).append("\n"); str.append("dwVpos=").append(QString::number(now_act.dwVpos)).append("\n"); str.append("dwButtons=").append(QString::number(now_act.dwButtons)).append("\n"); str.append("dwButtonNumber=").append(QString::number(now_act.dwButtonNumber)).append("\n"); str.append("dwPOV=").append(QString::number(now_act.dwPOV)).append("\n"); str.append("dwReserved1=").append(QString::number(now_act.dwReserved1)).append("\n"); str.append("dwReserved2=").append(QString::number(now_act.dwReserved2)).append("\n"); textEdit->setText(str); joy_dwRpos->setValue(static_cast<int>(now_act.dwRpos*100/65535)); joy_dwZpos->setValue(static_cast<int>((65535-now_act.dwZpos)*100/65535)); for(int i=0;i<joyBtnList.size();i++) { if(now_act.dwButtons & 0x01 << i) { joyBtnList[i]->setStyleSheet(jBstate_ON); }else { joyBtnList[i]->setStyleSheet(jBstate_OF); } } }
海康部分代碼
class camera_dialog : public QDialog { Q_OBJECT public: explicit camera_dialog(QWidget *parent = nullptr); ~camera_dialog(); void CurDataUpdate(); long play(long userID, HWND hWnd, NET_DVR_PREVIEWINFO struPlayInfo); void closeplay(long IRealPlayHandle); void StartRecord(); void StopRecord(); void Net_DevTimeConfig(); void on_devPlayBtn_clicked(); public slots: void CameraInit(); void on_devLoginBtn_clicked(); void on_SetCtrlDwSpeed(DWORD value); void on_devCloseBtn_clicked(); void on_RecordBtn_clicked(); void on_Camera_Up_pressed(); void on_Camera_Down_pressed(); void on_Camera_Left_pressed(); void on_Camera_Right_pressed(); void on_Camera_Stop_clicked(); void on_Zoom_Out_pressed(); void on_Zoom_In_pressed(); void on_Focus_Near_pressed(); void on_Focus_Far_pressed(); void Dev_Ctrl_PTZ( DWORD dwPTZCommand,DWORD dwStop,DWORD dwSpeed); private: Ui::camera_dialog *ui; long userID; long IRealPlayHandle; QTimer *DataTimer; QString IP; QString Port; QString User; QString PassWord; // DWORD dwStop; DWORD dwSpeed=7; long m_lPlayHandle; BOOL m_bIsRecording; NET_DVR_DEVICEINFO_V30 DeviceInfoTmp; };
- 搖桿控制攝像頭運動
- 手柄控制攝像頭運動