Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gamera_videos_no_ui
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
liusq
gamera_videos_no_ui
Commits
84806c68
Commit
84806c68
authored
Oct 09, 2024
by
guof
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'revert-
25af28ce
' into 'release'
Revert
25af28ce
See merge request
!31
parents
59627230
abb7cb7b
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
244 additions
and
751 deletions
+244
-751
AlgorithmTaskManage.cpp
+9
-9
CameraHandle.cpp
+75
-417
CameraHandle.h
+4
-24
Common.cpp
+4
-6
Common.h
+1
-3
FaceReconitionHandle.cpp
+11
-11
FaceReconitionHandle.h
+1
-1
HttpService.cpp
+7
-2
Httpclient.cpp
+1
-1
HumanDetection.cpp
+5
-2
HumanDetection.h
+1
-1
LicensePlateRecognition.cpp
+2
-0
LogHandle.h
+1
-1
LogHandler.cpp
+7
-18
MediaFaceImage.cpp
+15
-15
MediaFaceImage.h
+1
-1
MqttSubscriber.cpp
+28
-65
MqttSubscriber.h
+1
-1
ParkingSpaceInfo.cpp
+1
-0
VidesData.h
+13
-62
gamera_videos.pro
+0
-5
mainwindow.cpp
+46
-91
mainwindow.h
+10
-15
No files found.
AlgorithmTaskManage.cpp
View file @
84806c68
...
...
@@ -153,7 +153,7 @@ void* AlgorithmTaskManage::schedulingAlgorithm(int scheType) {
}
else
if
(
scheType
==
0x03
)
{
return
schedulingAlgorithmTemplate
(
faceReconitionHandles
,
mtxFace
);
}
else
{
q
Debug
()
<<
"参数错误"
;
q
Info
()
<<
"参数错误"
;
return
nullptr
;
}
}
...
...
@@ -170,10 +170,10 @@ void AlgorithmTaskManage::executeFindDoesItExistEmployee(const cv::Mat &source,s
if
(
selectedFaceReconition
!=
nullptr
&&
!
selectedFaceReconition
->
getImageChanged
())
{
selectedFaceReconition
->
setIsRunning
(
true
);
// 调用选定对象的doesItExistEmployee函数
q
Debug
()
<<
"人脸识别算法抢到===>sn"
<<
sSn
<<
selectedFaceReconition
;
selectedFaceReconition
->
doesItExistEmployee
(
s
Sn
,
s
ource
,
faces
);
q
Info
()
<<
"人脸识别算法抢到===>sn"
<<
sSn
<<
selectedFaceReconition
;
selectedFaceReconition
->
doesItExistEmployee
(
source
,
faces
);
}
else
{
q
Debug
()
<<
"没有可用的selectedFaceReconition对象可以调度"
;
q
Info
()
<<
"没有可用的selectedFaceReconition对象可以调度"
;
return
;
}
}
...
...
@@ -192,10 +192,10 @@ void AlgorithmTaskManage::executeFindlicensePlateNumber(const cv::Mat &source, Q
if
(
selectedLicensePlate
!=
nullptr
)
{
selectedLicensePlate
->
setIsRunning
(
true
);
// 调用选定对象的findHuManCar函数
q
Debug
()
<<
"车牌调度算法抢到===>sn"
<<
sSn
<<
selectedLicensePlate
;
q
Info
()
<<
"车牌调度算法抢到===>sn"
<<
sSn
<<
selectedLicensePlate
;
selectedLicensePlate
->
licensePlateNumber
(
source
,
lpNumber
,
plate
,
currentTime
);
}
else
{
q
Debug
()
<<
"没有可用的selectedLicensePlate对象可以调度"
;
q
Info
()
<<
"没有可用的selectedLicensePlate对象可以调度"
;
return
;
}
}
...
...
@@ -214,11 +214,11 @@ int AlgorithmTaskManage::executeFindHuManCar(const cv::Mat &source, int res,
selectedHumanDetection
->
setIsRunning
(
true
);
// 调用选定对象的findHuManCar函数
q
Debug
()
<<
"人形调度算法抢到===>sn"
<<
sSn
<<
"res"
<<
selectedHumanDetection
;
int
detectionResult
=
selectedHumanDetection
->
findHuManCar
(
source
,
res
,
resMap
,
sSn
,
heightReference
,
currentPlate
);
q
Info
()
<<
"人形调度算法抢到===>sn"
<<
sSn
<<
"res"
<<
selectedHumanDetection
;
int
detectionResult
=
selectedHumanDetection
->
findHuManCar
(
source
,
res
,
resMap
,
heightReference
,
currentPlate
);
return
detectionResult
;
}
else
{
q
Debug
()
<<
"没有可用的HumanDetection对象可以调度"
;
q
Info
()
<<
"没有可用的HumanDetection对象可以调度"
;
return
-
2
;
}
}
CameraHandle.cpp
View file @
84806c68
...
...
@@ -74,7 +74,7 @@ int CameraHandle::sdkDevLoginSyn(QString sDevId, int nDevPort, QString sUserName
loginParam
->
nCnnType
=
EDEV_CNN_TYPE_AUTO
;
int
loginResult
=
XSDK_DevLoginSyn
(
loginParam
,
nTimeout
);
if
(
loginResult
<
0
){
qInfo
()
<<
QString
(
"SN(%1): 登录设备失败"
).
arg
(
sSn
);
;
qInfo
()
<<
"登录设备失败"
;
return
loginResult
;
}
this
->
hDevice
=
loginResult
;
...
...
@@ -270,34 +270,32 @@ void CameraHandle::cameraParameterUpdate(vides_data::responseConfig &cloudConfig
}
}
if
(
this
->
face_frequency
!=
cloudConfig
.
faceConfig
.
faceFrequency
){
this
->
face_frequency
=
cloudConfig
.
faceConfig
.
faceFrequency
;
}
float
carConfidenceMax
=
cloudConfig
.
licensePlateConfig
.
carConfidenceMax
;
float
carConfidenceMin
=
cloudConfig
.
licensePlateConfig
.
carConfidenceMin
;
this
->
setCarConfidenceMaxAndMin
(
carConfidenceMax
,
carConfidenceMin
);
}
void
CameraHandle
::
initFaceFrequency
(
uint64
face_frequency
){
this
->
face_frequency
=
face_frequency
;
}
void
CameraHandle
::
initSdkRealTimeDevSnapSyn
(
int
syn_timer
,
uint64
face_frequency
)
{
connect
(
dev_snap_syn_timer
,
&
QTimer
::
timeout
,
this
,
[
this
]()
{
this
->
sdkRealTimeDevSnapSyn
();
void
CameraHandle
::
initSdkRealTimeDevSnapSyn
(
int
hDevice
,
int
syn_timer
,
uint64
face_frequency
)
{
connect
(
dev_snap_syn_timer
,
&
QTimer
::
timeout
,
this
,
[
this
,
hDevice
]()
{
this
->
sdkRealTimeDevSnapSyn
(
hDevice
);
},
Qt
::
QueuedConnection
);
this
->
face_frequency
=
face_frequency
;
dev_snap_syn_timer
->
start
(
syn_timer
);
}
void
CameraHandle
::
sdkRealTimeDevSnapSyn
()
{
void
CameraHandle
::
sdkRealTimeDevSnapSyn
(
int
hDevice
)
{
QThreadPool
*
threadPool
=
QThreadPool
::
globalInstance
();
auto
taskSyn
=
[
this
]()
{
sdkDevSnapSyn
(
this
->
hDevice
,
this
->
channel
);
auto
taskSyn
=
[
this
,
hDevice
]()
{
sdkDevSnapSyn
(
hDevice
,
this
->
channel
);
};
if
(
threadPool
->
activeThreadCount
()
>=
threadPool
->
maxThreadCount
())
{
qInfo
()
<<
QString
(
"SN(%1): 任务积压,跳过本次执行"
).
arg
(
sSn
)
;
qInfo
()
<<
"任务积压,跳过本次执行"
;
return
;
}
auto
taskRunnable
=
new
TaskRunnable
(
taskSyn
,
hDevice
,
this
->
channel
,
RunFunction
::
SdkDevSnapSyn
);
...
...
@@ -370,7 +368,7 @@ void CameraHandle::sdkDownloadFileByTime(XSDK_HANDLE hDevice,int id,
}
int
CameraHandle
::
callbackFunction
(
XSDK_HANDLE
hObject
,
QString
&
szString
)
{
if
(
!
semaphore
.
tryAcquire
())
{
qInfo
()
<<
QString
(
"SN(%1): sdkDevSnapSyn:正在执行线程"
).
arg
(
sSn
)
;
qInfo
()
<<
sSn
<<
"sdkDevSnapSyn:正在执行线程"
;
return
-
1
;
}
ScopeSemaphoreExit
guard
([
this
]()
{
...
...
@@ -397,7 +395,7 @@ int CameraHandle::callbackFunction(XSDK_HANDLE hObject, QString &szString) {
cv
::
Mat
image
;
MediaFaceImage
*
mediaFaceImage
=
MediaFaceImage
::
getInstance
();
qint64
currentTime
=
QDateTime
::
currentSecsSinceEpoch
();
mediaFaceImage
->
FaceImageCallBack
(
hObject
,
this
->
channel
,
image
,
sSn
);
mediaFaceImage
->
FaceImageCallBack
(
hObject
,
this
->
channel
,
image
);
if
(
image
.
empty
())
{
...
...
@@ -412,55 +410,14 @@ int CameraHandle::callbackFunction(XSDK_HANDLE hObject, QString &szString) {
updateImage
(
image
,
currentTime
);
}
/**
增加一键配网mqtt命令
对应设备连接局域网得情况下可通过盒子配置IP,实现快捷配网。
消息输入IP时配置为对应IP,不输入时则自动配置相同局域网网段ip
* @brief CameraHandle::distributionNetwork
*/
bool
CameraHandle
::
distributionNetwork
(
QString
&
ip
){
qInfo
()
<<
QString
(
"SN(%1): 一键配网的IP地址%2"
).
arg
(
sSn
).
arg
(
ip
);
int
old
=
hDevice
;
MainWindow
::
sp_this
->
setIsResetting
(
true
);
ScopeSemaphoreExit
guard
([]()
{
MainWindow
::
sp_this
->
setIsResetting
(
false
);
});
QString
reachableIp
;
MainWindow
::
sp_this
->
modifySnMapIp
(
sSn
,
url
);
if
(
ip
.
length
()
>
0
){
reachableIp
=
ip
;
qInfo
()
<<
QString
(
"SN(%1): reachableIpIP地址%2"
).
arg
(
sSn
).
arg
(
ip
);
qInfo
()
<<
QString
(
"SN(%1): IP地址%2"
).
arg
(
sSn
).
arg
(
reachableIp
);
}
else
{
reachableIp
=
vides_data
::
findReachableIp
();
if
(
!
reachableIp
.
isEmpty
())
{
qInfo
()
<<
QString
(
"SN(%1): 未使用的IP地址%2"
).
arg
(
sSn
).
arg
(
reachableIp
);
}
else
{
qInfo
()
<<
QString
(
"SN(%1): 找不到可使用的IP地址"
).
arg
(
sSn
);
return
false
;
}
}
bool
result
=
changeCameraIp
(
reachableIp
);
if
(
!
result
){
qInfo
()
<<
QString
(
"newIP(%1): wifiChangeIp"
).
arg
(
reachableIp
);
result
=
wifiChangeIp
(
reachableIp
,
false
,
old
);
}
return
result
;
}
void
CameraHandle
::
sdkDevSnapSyn
(
XSDK_HANDLE
hDevice
,
int
nChannel
){
if
(
hDevice
<=
0
){
qInfo
()
<<
QString
(
"SN(%1): 相机断线"
).
arg
(
sSn
)
;
qInfo
()
<<
"相机断线"
;
return
;
}
if
(
!
semaphore
.
tryAcquire
())
{
qInfo
()
<<
QString
(
"SN(%1): callbackFunction:正在执行线程"
).
arg
(
sSn
);
;
qInfo
()
<<
sSn
<<
"callbackFunction:正在执行线程"
;
return
;
}
ScopeSemaphoreExit
guard
([
this
]()
{
...
...
@@ -469,15 +426,18 @@ void CameraHandle::sdkDevSnapSyn(XSDK_HANDLE hDevice, int nChannel){
cv
::
Mat
image
;
MediaFaceImage
*
mediaFaceImage
=
MediaFaceImage
::
getInstance
();
qint64
currentTime
=
QDateTime
::
currentSecsSinceEpoch
();
int
ret
=
mediaFaceImage
->
FaceImageCallBack
(
hDevice
,
nChannel
,
image
,
sSn
);
int
ret
=
mediaFaceImage
->
FaceImageCallBack
(
hDevice
,
nChannel
,
image
);
if
(
ret
<
0
)
{
offlineCount
++
;
// 累加计数器
qInfo
()
<<
"offlineCount: "
<<
loginParam
->
sDevId
<<
offlineCount
;
if
(
offlineCount
>=
3
)
{
// 判断是否连续3次返回0
qInfo
()
<<
QString
(
"SN(%1): 设备离线"
).
arg
(
sSn
);
qInfo
()
<<
"设备离线"
;
QString
ip
=
QString
::
fromUtf8
(
loginParam
->
sDevId
);
bool
is_ping
=
vides_data
::
pingAddress
(
ip
);
q
Debug
()
<<
sSn
<<
":
ping 的结果"
<<
is_ping
;
q
Info
()
<<
"
ping 的结果"
<<
is_ping
;
if
(
is_ping
){
deviceReboot
();
}
else
{
...
...
@@ -497,12 +457,11 @@ void CameraHandle::sdkDevSnapSyn(XSDK_HANDLE hDevice, int nChannel){
}
if
(
image
.
empty
())
{
qInfo
()
<<
QString
(
"SN(%1): Failed to read the image"
).
arg
(
sSn
)
;
qInfo
()
<<
"Failed to read the image"
;
return
;
}
if
(
image
.
rows
<=
0
||
image
.
cols
<=
0
||
image
.
channels
()
<=
0
)
{
qInfo
()
<<
QString
(
"SN(%1): 图像尺寸或通道数不正确,需排查原因"
).
arg
(
sSn
);
qInfo
()
<<
"图像尺寸或通道数不正确,需排查原因"
;
return
;
}
updateImage
(
image
,
currentTime
);
...
...
@@ -524,9 +483,8 @@ void CameraHandle::checkAndUpdateCurrentPlate(ParkingSpaceInfo*park,const cv::Ma
}
}
qInfo
()
<<
QString
(
"SN(%1): 最新车牌%2,当前区域车牌:%3"
).
arg
(
sSn
).
arg
(
newInfo
.
getLicensePlate
()).
arg
(
park
->
getCurrentPlate
().
getLicensePlate
());
qInfo
()
<<
QString
(
"SN(%1): 区域:%2,数量:%3"
).
arg
(
sSn
).
arg
(
park
->
getSpaceIndex
()).
arg
(
count
);
qInfo
()
<<
"最新车牌"
<<
newInfo
.
getLicensePlate
()
<<
"区域当前车牌"
<<
park
->
getCurrentPlate
().
getLicensePlate
();
qInfo
()
<<
"不同的区域:"
<<
park
->
getSpaceIndex
()
<<
",数量:"
<<
count
;
if
(
count
>=
3
)
{
//第一次进场 当前车牌就是进来这个,老车牌就是空
if
(
park
->
getCurrentPlate
().
getLicensePlate
().
length
()
<=
0
){
...
...
@@ -541,17 +499,17 @@ void CameraHandle::checkAndUpdateCurrentPlate(ParkingSpaceInfo*park,const cv::Ma
std
::
map
<
int
,
int
>
resMap
;
int
car_size
=
algorithmTaskManage
.
executeFindHuManCar
(
frame
,
0x01
,
currentPlates
,
resMap
,
sSn
,
heightReference
);
qInfo
()
<<
QString
(
"SN(%1): 当前车形数量:%2"
).
arg
(
sSn
).
arg
(
car_size
)
;
qInfo
()
<<
sSn
<<
":"
<<
"当前车形数量:"
<<
car_size
;
if
(
car_size
<=
0
&&
car_size
!=-
2
)
{
qInfo
()
<<
QString
(
"SN(%1): 区域:%2出场"
).
arg
(
sSn
).
arg
(
park
->
getSpaceIndex
())
;
qInfo
()
<<
sSn
<<
"区域:"
<<
park
->
getSpaceIndex
()
<<
": 出场:"
;
//如果有车辆检测到并且不在停车区域内部,视为出场
park
->
setCurrentPlate
(
newInfo
);
result
=
Exit
;
}
else
{
// 没有车辆或车辆在停车区域内部,移除队列
park
->
removeNoQueue
();
q
Debug
()
<<
QString
(
"SN(%1): no出场::%2"
).
arg
(
sSn
).
arg
(
car_size
)
;
q
Info
()
<<
sSn
<<
": no出场:"
<<
car_size
;
}
}
else
{
//当前不为空,新车,新车入场,老车出场
...
...
@@ -631,7 +589,7 @@ void CameraHandle::updateImage(const cv::Mat & frame,qint64 currentTime){
std
::
map
<
QString
,
vides_data
::
requestFaceReconition
>
mapFaces
;
ScopeSemaphoreExit
guard
([
this
]()
{
faceCount
.
fetch_add
(
1
,
std
::
memory_order_relaxed
);
});
...
...
@@ -643,8 +601,8 @@ void CameraHandle::updateImage(const cv::Mat & frame,qint64 currentTime){
int
faSize
=
0
;
std
::
vector
<
vides_data
::
ParkingArea
>
currentPlates
;
int
uniforms
=
0x00
;
qInfo
()
<<
"updateImage"
<<
algorithmPermissions
;
std
::
map
<
int
,
int
>
resMap
;
qInfo
()
<<
QString
(
"SN(%1): 相机算法:%2"
).
arg
(
sSn
).
arg
(
algorithmPermissions
);
if
((
algorithmPermissions
&
0x01
<<
3
)
!=
0
)
{
//穿工服算法
if
((
algorithmPermissions
&
0x01
<<
2
)
!=
0
)
{
...
...
@@ -662,47 +620,37 @@ void CameraHandle::updateImage(const cv::Mat & frame,qint64 currentTime){
}
}
if
(
uniforms
==-
2
||
faSize
==-
2
){
qInfo
()
<<
QString
(
"SN(%1): 没有可用的HumanDetection对象可以调度"
).
arg
(
sSn
)
;
qInfo
()
<<
"没有可用的HumanDetection对象可以调度"
;
return
;
}
QPoint
point_info
(
faSize
,
uniforms
);
if
(
isChanged
(
point_info
,
faceMapWorker
)){
qInfo
()
<<
QString
(
"SN(%1): 人形计算器:%2"
).
arg
(
sSn
).
arg
(
faceCount
);
qInfo
()
<<
QString
(
"SN(%1): 人形频率:%2"
).
arg
(
sSn
).
arg
(
face_frequency
);
if
(
faceCount
.
load
(
std
::
memory_order_relaxed
)
%
face_frequency
==
0
){
int
worker
=
0x00
;
if
((
algorithmPermissions
&
0x01
<<
2
)
!=
0
)
{
worker
=
(
faSize
-
uniforms
>
0
)
?
(
faSize
-
uniforms
)
:
0
;
}
qInfo
()
<<
"工作人数==>"
<<
worker
;
vides_data
::
response
*
resp
=
httpService
.
httpPostFacePopulation
(
imgs
,
faSize
,
worker
,
sSn
,
currentTime
);
if
(
resp
->
code
!=
0
)
{
if
(
resp
->
msg
==
"TimeoutError"
)
{
QByteArray
num_imgs
;
httpService
.
setHttpUrl
(
httpUrl
);
vides_data
::
response
*
img_resp
=
httpService
.
httpPostFacePopulation
(
num_imgs
,
faSize
,
worker
,
sSn
,
currentTime
);
if
(
img_resp
->
code
!=
0
)
{
qInfo
()
<<
QString
(
"SN(%1):不加图片人数变化推送信息推送失败,失败信息%2"
).
arg
(
sSn
).
arg
(
img_resp
->
msg
);
}
else
{
qInfo
()
<<
QString
(
"SN(%1): 不加图片人数变化推送信息推送成功"
).
arg
(
sSn
);
qInfo
()
<<
"不加图片人数变化推送信息推送失败"
;
}
instace
.
deleteObj
(
img_resp
);
}
else
{
qInfo
()
<<
QString
(
"SN(%1): 人数变化推送失败,失败信息%2"
).
arg
(
sSn
).
arg
(
resp
->
msg
);
}
}
else
{
qInfo
()
<<
QString
(
"SN(%1): 人数变化推送成功"
).
arg
(
sSn
);
}
instace
.
deleteObj
(
resp
);
faceMapWorker
.
setX
(
faSize
);
faceMapWorker
.
setY
(
uniforms
);
}
}
if
(
faSize
>
0
&&
(
algorithmPermissions
&
0x01
<<
1
)
!=
0
){
std
::
list
<
vides_data
::
faceRecognitionResult
>
faces
;
algorithmTaskManage
.
executeFindDoesItExistEmployee
(
frame
,
faces
,
sSn
);
...
...
@@ -719,12 +667,12 @@ void CameraHandle::updateImage(const cv::Mat & frame,qint64 currentTime){
faceReconition
.
area
.
bottom_right_corner_y
=
face
.
y
+
face
.
height
;
faceReconition
.
area
.
bottom_left_corner_x
=
face
.
x
;
faceReconition
.
area
.
bottom_left_corner_y
=
face
.
y
+
face
.
height
;
faceReconition
.
area
.
top_right_corner_x
=
face
.
x
+
face
.
width
;
faceReconition
.
area
.
top_right_corner_y
=
face
.
y
;
httpService
.
setHttpUrl
(
httpUrl
);
vides_data
::
response
*
resp
=
httpService
.
httpPostFaceReconition
(
faceReconition
);
mapFaces
.
insert
(
std
::
make_pair
(
face
.
id
,
faceReconition
));
if
(
resp
->
code
!=
0
)
{
if
(
resp
->
msg
==
"TimeoutError"
)
{
...
...
@@ -732,22 +680,19 @@ void CameraHandle::updateImage(const cv::Mat & frame,qint64 currentTime){
httpService
.
setHttpUrl
(
httpUrl
);
vides_data
::
response
*
img_resp
=
httpService
.
httpPostFaceReconition
(
faceReconition
);
if
(
img_resp
->
code
!=
0
)
{
qInfo
()
<<
QString
(
"SN(%1): 不加图片人脸信息推送失败,失败信息%2,人脸id%3"
).
arg
(
sSn
).
arg
(
resp
->
msg
).
arg
(
face
.
id
);
}
else
{
qInfo
()
<<
QString
(
"SN(%1): 不加图片人脸信息推送成功"
).
arg
(
sSn
);
qInfo
()
<<
"不加图片人脸信息推送失败"
;
qInfo
()
<<
"不加图片识别人code"
<<
resp
->
code
;
qInfo
()
<<
"不加图片识别人msg"
<<
resp
->
msg
;
qInfo
()
<<
"不加图片识别人脸信息推送失败"
<<
face
.
id
;
}
instace
.
deleteObj
(
img_resp
);
}
else
{
qInfo
()
<<
QString
(
"SN(%1): 人脸信息推送失败,失败信息%2"
).
arg
(
sSn
).
arg
(
resp
->
msg
);
}
}
else
{
qInfo
()
<<
QString
(
"SN(%1): 人脸信息推送成功"
).
arg
(
sSn
);
}
instace
.
deleteObj
(
resp
);
}
}
}
if
((
algorithmPermissions
&
0x01
<<
2
)
!=
0
)
{
if
(
uniforms
>
0
){
//未穿工服的人数
...
...
@@ -762,23 +707,18 @@ void CameraHandle::updateImage(const cv::Mat & frame,qint64 currentTime){
httpService
.
setHttpUrl
(
httpUrl
);
vides_data
::
response
*
img_resp
=
httpService
.
httpPostUniforms
(
num_imgs
,
strUniform
,
sSn
,
currentTime
);
if
(
img_resp
->
code
!=
0
)
{
qInfo
()
<<
QString
(
"SN(%1): 不加图片推送未穿工服人数失败,失败信息%2"
).
arg
(
sSn
).
arg
(
img_resp
->
msg
);
}
else
{
qInfo
()
<<
QString
(
"SN(%1): 不加图片推送未穿工服人数成功"
).
arg
(
sSn
);
qInfo
()
<<
"不加图片推送未穿工服人数失败"
;
}
instace
.
deleteObj
(
img_resp
);
}
else
{
qInfo
()
<<
QString
(
"SN(%1): 推送未穿工服人数失败,失败信息%2"
).
arg
(
sSn
).
arg
(
resp
->
msg
);
}
}
else
{
qInfo
()
<<
QString
(
"SN(%1): 推送未穿工服人数成功"
).
arg
(
sSn
);
}
instace
.
deleteObj
(
resp
);
}
}
}
}
else
{
q
Debug
()
<<
sSn
<<
":
人形识别算法关闭,只有车牌算法了"
;
q
Info
()
<<
"
人形识别算法关闭,只有车牌算法了"
;
}
//关闭车牌识别
if
((
algorithmPermissions
&
0x01
)
==
0
)
{
...
...
@@ -817,6 +757,8 @@ void CameraHandle::updateImage(const cv::Mat & frame,qint64 currentTime){
}
}
vides_data
::
requestLicensePlate
newPlate
;
newPlate
.
sn
=
sSn
;
...
...
@@ -842,7 +784,7 @@ void CameraHandle::updateImage(const cv::Mat & frame,qint64 currentTime){
if
(
parkAreaMap
!=
parkMap
.
end
())
{
value
=
parkAreaMap
->
second
;
// 成功找到,获取
}
else
{
qInfo
()
<<
QString
(
"SN(%1): 区域%2不存在"
).
arg
(
sSn
).
arg
(
key
)
;
qInfo
()
<<
sSn
<<
"==>区域不存在:"
<<
key
;
continue
;
}
vides_data
::
requestLicensePlate
resultPlate
;
...
...
@@ -851,7 +793,7 @@ void CameraHandle::updateImage(const cv::Mat & frame,qint64 currentTime){
algorithmTaskManage
.
executeFindlicensePlateNumber
(
areaMat
,
lpNumber
,
resultPlate
,
currentTime
,
sSn
);
std
::
list
<
vides_data
::
LicensePlate
>
ps
=
resultPlate
.
plates
;
qInfo
()
<<
QString
(
"
SN(%1):
区域:%2识别的车牌信息是:%3"
).
arg
(
sSn
).
arg
(
key
).
qInfo
()
<<
QString
(
"
sn==>%1,
区域:%2识别的车牌信息是:%3"
).
arg
(
sSn
).
arg
(
key
).
arg
(
lpNumber
);
if
(
ps
.
size
()
==
0
){
int
res
=-
1
;
...
...
@@ -886,13 +828,13 @@ void CameraHandle::updateImage(const cv::Mat & frame,qint64 currentTime){
RecognizedInfo
recognizedInfo
;
if
(
maxPlate
.
new_color
==
"蓝牌"
&&
maxPlate
.
new_plate
.
length
()
!=
7
)
{
q
Debug
()
<<
QString
(
"SN(%1): 蓝牌车牌号%2,recognition.new_plate.length()=%3"
).
arg
(
sSn
).
arg
(
maxPlate
.
new_plate
).
arg
(
maxPlate
.
new_plate
.
length
()
);
q
Info
()
<<
sSn
<<
"==>蓝牌车牌号:"
<<
maxPlate
.
new_plate
<<
"===>recognition.new_plate.length():"
<<
maxPlate
.
new_plate
.
length
(
);
continue
;
}
else
if
(
maxPlate
.
new_color
==
"绿牌新能源"
&&
maxPlate
.
new_plate
.
length
()
!=
8
)
{
q
Debug
()
<<
QString
(
"SN(%1): 绿牌车牌号%2,recognition.new_plate.length()=%3"
).
arg
(
sSn
).
arg
(
maxPlate
.
new_plate
).
arg
(
maxPlate
.
new_plate
.
length
()
);
q
Info
()
<<
sSn
<<
"==>绿牌车牌号:"
<<
maxPlate
.
new_plate
<<
"===>recognition.new_plate.length():"
<<
maxPlate
.
new_plate
.
length
(
);
continue
;
}
else
if
(
maxPlate
.
new_plate
.
length
()
<
7
)
{
q
Debug
()
<<
QString
(
"SN(%1): 非绿牌蓝牌车牌号%2,recognition.new_plate.length()=%3"
).
arg
(
sSn
).
arg
(
maxPlate
.
new_plate
).
arg
(
maxPlate
.
new_plate
.
length
()
);
q
Info
()
<<
sSn
<<
"==>非绿牌蓝牌车牌号:"
<<
maxPlate
.
new_plate
<<
"===>recognition.new_plate.length():"
<<
maxPlate
.
new_plate
.
length
(
);
continue
;
}
if
(
maxPlate
.
text_confidence
>=
carConfidenceMax
){
...
...
@@ -909,8 +851,7 @@ void CameraHandle::updateImage(const cv::Mat & frame,qint64 currentTime){
this
->
checkAndUpdateCurrentPlate
(
value
,
areaMat
,
recognizedInfo
,
res
);
}
if
(
maxPlate
.
text_confidence
<=
carConfidenceMin
){
qDebug
()
<<
QString
(
"SN(%1): recognition.text_confidence<=instace.getCarConfidenceMin:%2"
).
arg
(
sSn
).
arg
(
carConfidenceMin
);
qInfo
()
<<
sSn
<<
"==>recognition.text_confidence<=instace.getCarConfidenceMin"
<<
carConfidenceMin
;
continue
;
}
if
(
maxPlate
.
text_confidence
>
carConfidenceMin
...
...
@@ -929,6 +870,7 @@ void CameraHandle::updateImage(const cv::Mat & frame,qint64 currentTime){
maxPlate
.
img
=
imgs
;
maxPlate
.
new_color
=
recognizedInfo
.
getColor
();
newPlate
.
plates
.
push_back
(
std
::
move
(
maxPlate
));
qInfo
()
<<
QString
(
"当前进入ps.size()>0 --> res == Exit || res == Mobilization 是当前校验返回结果是:%1"
).
arg
(
res
);
}
if
(
res
==
ExitAndMobilization
){
maxPlate
.
areaLocation
=
value
->
getArea
();
...
...
@@ -941,8 +883,7 @@ void CameraHandle::updateImage(const cv::Mat & frame,qint64 currentTime){
}
if
(
newPlate
.
plates
.
size
()
>
0
){
foreach
(
auto
var
,
newPlate
.
plates
)
{
qInfo
()
<<
QString
(
"SN(%1): 识别的车牌号是:%2"
).
arg
(
sSn
).
arg
(
var
.
new_plate
);
qInfo
()
<<
QString
(
"sn:%1 =>识别的车牌号是:%2"
).
arg
(
sSn
).
arg
(
var
.
new_plate
);
}
licensePlateRecognitionResults
(
newPlate
);
}
...
...
@@ -1001,37 +942,17 @@ void CameraHandle::licensePlateRecognitionResults(vides_data::requestLicensePlat
httpService
.
setHttpUrl
(
httpUrl
);
vides_data
::
response
*
img_resp
=
httpService
.
httpLicensePlateRecognition
(
location
,
result
);
if
(
img_resp
->
code
!=
0
)
{
qInfo
()
<<
QString
(
"SN(%1): 车牌不加图片上传失败:失败信息%2"
).
arg
(
sSn
).
arg
(
img_resp
->
msg
);
}
else
{
qInfo
()
<<
QString
(
"SN(%1): 车牌不加图片上传成功"
).
arg
(
sSn
);
qInfo
()
<<
"车牌不加图片上传失败"
;
}
instace
.
deleteObj
(
img_resp
);
}
else
{
qInfo
()
<<
QString
(
"SN(%1): 车牌识别结果上传失败:失败信息%2"
).
arg
(
sSn
).
arg
(
resp
->
msg
)
;
qInfo
()
<<
"licensePlateRecognitionResults:车牌识别结果失败"
;
// 在达到最大重试次数且仍然没有成功的情况下执行相应的处理逻辑
}
}
instace
.
deleteObj
(
resp
);
}
bool
CameraHandle
::
isWifiConnect
(
XSDK_HANDLE
hDevice
,
XSDK_CFG
::
NetWork_Wifi
&
cfg
){
char
szOutBuffer
[
4000
]
=
{
0
};
int
nInOutSize
=
sizeof
(
szOutBuffer
);
// 获取并解析配置
int
nResult
=
XSDK_DevGetSysConfigSyn
(
hDevice
,
JK_NetWork_Wifi
,
szOutBuffer
,
&
nInOutSize
,
3000
,
EXCMD_CONFIG_GET
);
qInfo
()
<<
szOutBuffer
;
if
(
nResult
>=
0
)
{
cfg
.
Parse
(
szOutBuffer
);
return
strlen
(
cfg
.
SSID
.
Value
())
>
0
;
}
else
{
printf
(
"Failed to get Wi-Fi configuration. Error code: %d
\n
"
,
nResult
);
return
false
;
}
instace
.
deleteObj
(
resp
);
}
void
CameraHandle
::
printWifi
(
XSDK_HANDLE
hDevice
,
XSDK_CFG
::
NetWork_Wifi
&
cfg
){
char
szOutBuffer
[
4000
]
=
{
0
};
int
nInOutSize
=
sizeof
(
szOutBuffer
);
...
...
@@ -1047,281 +968,30 @@ void CameraHandle::printWifi(XSDK_HANDLE hDevice,XSDK_CFG::NetWork_Wifi &cfg){
}
}
/**
* @brief CameraHandle::resetGb28181
* 1. 关闭对应摄像头GB28181
2. 修改设备IP并保存当前IP
3. 定时(增加配置 默认5s)后修改为原IP(保证本地NVR可用)
4. 启动GB28181
需注意和定时任务对比GB28181配置冲突处理
需确认修改IP后抓图是否正常,如不正常需在命令开始前增加删除句柄,命令完成后增加句柄以保证抓图实时性
*/
int
CameraHandle
::
resetGb28181
(){
int
old
=
hDevice
;
MainWindow
::
sp_this
->
setIsResetting
(
true
);
bool
is_wifi
=
false
;
ScopeSemaphoreExit
guard
([
this
]()
{
MainWindow
::
sp_this
->
setIsResetting
(
false
);
});
this
->
updateSdkDevStatus
(
false
);
QString
ip
=
QString
::
fromUtf8
(
loginParam
->
sDevId
);
QString
reachableIp
=
vides_data
::
findReachableIp
();
if
(
!
reachableIp
.
isEmpty
())
{
qInfo
()
<<
QString
(
"SN(%1): 未使用的IP地址%2"
).
arg
(
sSn
).
arg
(
reachableIp
);
}
else
{
qInfo
()
<<
QString
(
"SN(%1): 找不到可使用的IP地址"
).
arg
(
sSn
);
return
-
1
;
}
this
->
hDevice
=-
1
;
MainWindow
::
sp_this
->
modifySnMapIp
(
sSn
,
url
);
bool
result
=
changeCameraIp
(
reachableIp
);
int
newHandle
=-
1
;
if
(
!
result
){
result
=
wifiChangeIp
(
reachableIp
,
false
,
old
);
is_wifi
=
true
;
if
(
result
){
//老句柄抓图不正常了
int
sdk_handle
=
this
->
sdkDevLoginSyn
(
reachableIp
,
loginParam
->
nDevPort
,
loginParam
->
sUserName
,
loginParam
->
sPassword
,
3000
);
if
(
sdk_handle
<
0
){
qInfo
()
<<
QString
(
"SN(%1): WIFI新句柄生成失败"
).
arg
(
sSn
);
return
-
1
;
}
else
{
qInfo
()
<<
QString
(
"SN(%1): WIFI新句柄生成成功"
).
arg
(
sSn
);
newHandle
=
sdk_handle
;
this
->
hDevice
=-
1
;
XSDK_DevLogout
(
old
);
}
}
}
// 阻塞等待5秒
QThread
::
sleep
(
5
);
QString
old_ip
;
MainWindow
::
sp_this
->
findSnMapIp
(
this
->
sSn
,
old_ip
);
if
(
old_ip
.
length
()
>
0
){
if
(
is_wifi
){
result
=
wifiChangeIp
(
old_ip
,
true
,
newHandle
);
int
sdk_handle
=
this
->
sdkDevLoginSyn
(
old_ip
,
loginParam
->
nDevPort
,
loginParam
->
sUserName
,
loginParam
->
sPassword
,
3000
);
if
(
sdk_handle
<
0
){
qInfo
()
<<
QString
(
"SN(%1): WIFI新句柄生成失败"
).
arg
(
sSn
);
}
else
{
XSDK_DevLogout
(
newHandle
);
qInfo
()
<<
QString
(
"SN(%1): WIFI新句柄生成成功"
).
arg
(
sSn
);
}
}
else
{
bool
result
=
this
->
changeCameraIp
(
old_ip
);
if
(
result
){
int
sdk_handle
=
this
->
sdkDevLoginSyn
(
old_ip
,
loginParam
->
nDevPort
,
loginParam
->
sUserName
,
loginParam
->
sPassword
,
3000
);
if
(
sdk_handle
<
0
){
qInfo
()
<<
QString
(
"SN(%1): 有线新句柄生成失败"
).
arg
(
sSn
);
}
else
{
XSDK_DevLogout
(
old
);
qInfo
()
<<
QString
(
"SN(%1): 有线新句柄生成成功"
).
arg
(
sSn
);
}
}
}
}
return
this
->
updateSdkDevStatus
(
true
);
}
bool
CameraHandle
::
changeCameraIp
(
QString
&
reachableIp
){
QString
localMac
,
subnetMask
,
gateway
;
bool
success
=
vides_data
::
GetNetworkInfoByQNetworkInterface
(
localMac
,
subnetMask
,
gateway
);
if
(
!
success
)
{
qInfo
()
<<
QString
(
"SN(%1): 获取本地MAC失败"
).
arg
(
sSn
);
return
false
;
}
QByteArray
&&
byJson
=
localMac
.
toUtf8
();
const
char
*
mac
=
byJson
.
data
();
QByteArray
&&
byJsonIp
=
reachableIp
.
toUtf8
();
const
char
*
charIp
=
byJsonIp
.
data
();
signed
char
newEncryptPsw
[
512
]
=
{
0
};
int
nMaxCount
=
100
;
SXSDK_CONFIG_NET_COMMON
*
pRet
=
new
SXSDK_CONFIG_NET_COMMON
[
nMaxCount
];
SXSDK_CONFIG_NET_COMMON
*
pDevice
=
nullptr
;
ScopeSemaphoreExit
guard
([
&
pRet
]()
{
delete
[]
pRet
;
});
memset
(
pRet
,
0
,
sizeof
(
SXSDK_CONFIG_NET_COMMON
)
*
nMaxCount
);
int
nCount
=
XSDK_SearchDevicesSyn
(
pRet
,
nMaxCount
);
if
(
nCount
<=
0
)
{
qInfo
()
<<
QString
(
"SN(%1): 搜索不到设备"
).
arg
(
sSn
);
delete
[]
pRet
;
return
false
;
}
for
(
int
i
=
0
;
i
<
nCount
;
i
++
)
{
qInfo
()
<<
QString
(
"[%1][IP:%2.%3.%4.%5][SN:%6][Mac:%7]"
)
.
arg
(
i
)
.
arg
(
pRet
[
i
].
HostIP
.
c
[
0
])
.
arg
(
pRet
[
i
].
HostIP
.
c
[
1
])
.
arg
(
pRet
[
i
].
HostIP
.
c
[
2
])
.
arg
(
pRet
[
i
].
HostIP
.
c
[
3
])
.
arg
(
pRet
[
i
].
sSn
)
.
arg
(
pRet
[
i
].
sMac
);
if
(
QString
(
pRet
[
i
].
sSn
)
==
sSn
)
{
pDevice
=
new
SXSDK_CONFIG_NET_COMMON
;
memset
(
pDevice
,
0
,
sizeof
(
SXSDK_CONFIG_NET_COMMON
));
memcpy
(
pDevice
,
&
pRet
[
i
],
sizeof
(
SXSDK_CONFIG_NET_COMMON
));
break
;
}
}
if
(
pDevice
==
nullptr
)
{
qInfo
()
<<
QString
(
"SN(%1): 有线未找到匹配的设备"
).
arg
(
sSn
);
}
else
{
// 处理找到的设备信息
qInfo
()
<<
QString
(
"有线找到匹配的设备: SN(%1) IP:%2.%3.%4.%5 Mac:%6"
)
.
arg
(
pDevice
->
sSn
)
.
arg
(
pDevice
->
HostIP
.
c
[
0
])
.
arg
(
pDevice
->
HostIP
.
c
[
1
])
.
arg
(
pDevice
->
HostIP
.
c
[
2
])
.
arg
(
pDevice
->
HostIP
.
c
[
3
])
.
arg
(
pDevice
->
sMac
);
// 在这里进行设备IP地址的更改操作
SXSDK_CONFIG_NET_COMMON_V2
devInfo
;
memset
(
&
devInfo
,
0
,
sizeof
(
SXSDK_CONFIG_NET_COMMON_V2
));
XSDK_EncryptPassword
(
""
,
newEncryptPsw
,
512
);
devInfo
.
HostIP
.
l
=
inet_addr
(
charIp
);
devInfo
.
Gateway
.
l
=
inet_addr
(
gateway
.
toStdString
().
c_str
());
devInfo
.
Submask
.
l
=
inet_addr
(
subnetMask
.
toStdString
().
c_str
());
strcpy
(
devInfo
.
HostName
,
pDevice
->
HostName
);
devInfo
.
HttpPort
=
pDevice
->
HttpPort
;
strcpy
(
devInfo
.
LocalMac
,
mac
);
devInfo
.
MaxBps
=
pDevice
->
MaxBps
;
devInfo
.
MaxConn
=
pDevice
->
MaxConn
;
devInfo
.
MonMode
=
pDevice
->
MonMode
;
devInfo
.
nPasswordType
=
1
;
strcpy
(
devInfo
.
sMac
,
pDevice
->
sMac
);
strcpy
(
devInfo
.
Password
,
(
const
char
*
)
newEncryptPsw
);
devInfo
.
SSLPort
=
pDevice
->
SSLPort
;
devInfo
.
TCPPort
=
pDevice
->
TCPPort
;
devInfo
.
TransferPlan
=
pDevice
->
TransferPlan
;
devInfo
.
UDPPort
=
pDevice
->
UDPPort
;
strcpy
(
devInfo
.
UserName
,
loginParam
->
sUserName
);
int
nRet
=
XSDK_ModifyDevIP
((
const
char
*
)
&
devInfo
,
sizeof
(
SXSDK_CONFIG_NET_COMMON_V2
),
10000
);
delete
pDevice
;
if
(
nRet
<
0
){
qInfo
()
<<
QString
(
"SN(%1): 有线修复ip失败错误码:%2"
).
arg
(
sSn
).
arg
(
nRet
);
return
false
;
}
}
return
true
;
}
bool
CameraHandle
::
wifiChangeIp
(
QString
&
Ip
,
bool
is_connect
,
int
h_device
){
XSDK_CFG
::
NetWork_Wifi
wif
;
printWifi
(
h_device
,
wif
);
if
(
is_connect
){
if
(
!
isWifiConnect
(
h_device
,
wif
)){
qInfo
()
<<
QString
(
"SN(%1): 不是wifi连接"
).
arg
(
sSn
);
return
false
;
}
}
QString
hex
=
DecIpToHexIp
(
Ip
);
QByteArray
&&
byIp
=
hex
.
toUtf8
();
const
char
*
cpIp
=
byIp
.
data
();
wif
.
HostIP
.
SetValue
(
cpIp
);
wif
.
Enable
.
SetValue
(
true
);
wif
.
KeyType
.
SetValue
(
1
);
wif
.
EncrypType
.
SetValue
(
"AES"
);
wif
.
Auth
.
SetValue
(
"WPA2PSK"
);
void
CameraHandle
::
sdkWifi
(
QString
&
pwd
,
QString
&
ssid
){
const
char
*
wipCfg
=
wif
.
ToString
();
char
szOutBuffer
[
512
]
=
{
0
};
int
nLen
=
sizeof
(
szOutBuffer
);
int
res
=
XSDK_DevSetSysConfigSyn
(
h_device
,
JK_NetWork_Wifi
,
wipCfg
,
strlen
(
wipCfg
),
szOutBuffer
,
&
nLen
,
3000
,
EXCMD_CONFIG_SET
);
if
(
res
<
0
){
qInfo
()
<<
QString
(
"SN(%1): 无线修改wifi失败:%2"
).
arg
(
sSn
).
arg
(
res
);
return
false
;
}
return
true
;
}
QString
CameraHandle
::
DecIpToHexIp
(
const
QString
&
decIp
)
{
// 将 IP 地址按点号分割成多个部分
QStringList
parts
=
decIp
.
split
(
"."
);
// 检查 IP 地址是否有效(应包含 4 个部分)
if
(
parts
.
size
()
!=
4
)
{
return
QString
();
// 如果无效,返回空字符串
}
QString
hexIp
;
// 用于存储最终的十六进制表示
// 从最后一个部分开始遍历
for
(
int
i
=
3
;
i
>=
0
;
--
i
)
{
// 将每个部分转换为整数
bool
ok
;
int
part
=
parts
[
i
].
toInt
(
&
ok
);
if
(
!
ok
)
return
QString
();
// 如果转换失败,返回空字符串
// 将整数转换为十六进制字符串,并在必要时补零
QString
hexPart
=
QString
::
number
(
part
,
16
).
rightJustified
(
2
,
'0'
);
// 将十六进制字符串添加到结果中
hexIp
.
append
(
hexPart
);
}
// 在结果前添加 "0x" 以表示十六进制
hexIp
.
prepend
(
"0x"
);
return
hexIp
;
// 返回最终的十六进制表示
}
bool
CameraHandle
::
sdkWifi
(
QString
&
pwd
,
QString
&
ssid
){
XSDK_CFG
::
NetWork_Wifi
wif
;
printWifi
(
hDevice
,
wif
);
QByteArray
&&
byPwd
=
pwd
.
toUtf8
();
const
char
*
cpwd
=
byPwd
.
data
();
wif
.
Keys
.
SetValue
(
cpwd
);
QString
reachableIp
=
vides_data
::
findReachableIp
();
QString
hex
=
DecIpToHexIp
(
reachableIp
);
QByteArray
&&
byJson
=
ssid
.
toUtf8
();
const
char
*
cssid
=
byJson
.
data
();
wif
.
SSID
.
SetValue
(
cssid
);
wif
.
Enable
.
SetValue
(
true
);
wif
.
KeyType
.
SetValue
(
1
);
wif
.
EncrypType
.
SetValue
(
"AES"
);
wif
.
Auth
.
SetValue
(
"WPA2PSK"
);
QByteArray
&&
byHex
=
hex
.
toUtf8
();
const
char
*
c_hex
=
byHex
.
data
();
wif
.
HostIP
.
SetValue
(
c_hex
);
//wif.HostIP.SetValue(newc_ip);
const
char
*
wipCfg
=
wif
.
ToString
();
qInfo
()
<<
"wipCfg==>"
<<
wipCfg
;
char
szOutBuffer
[
512
]
=
{
0
};
int
nLen
=
sizeof
(
szOutBuffer
);
int
res
=
XSDK_DevSetSysConfigSyn
(
hDevice
,
JK_NetWork_Wifi
,
wipCfg
,
strlen
(
wipCfg
),
szOutBuffer
,
&
nLen
,
3000
,
EXCMD_CONFIG_SET
);
if
(
res
<
0
){
qInfo
()
<<
QString
(
"SN(%1): 修改wifi失败:%2"
).
arg
(
sSn
).
arg
(
res
)
;
return
false
;
qInfo
()
<<
"修改wifi失败"
;
}
deviceReboot
();
return
true
;
}
void
CameraHandle
::
sdkDevSystemTimeZoneSyn
(
QString
&
time
){
...
...
@@ -1333,23 +1003,23 @@ void CameraHandle::sdkDevSystemTimeZoneSyn(QString &time){
int
res
=
XSDK_DevSetSysConfigSyn
(
hDevice
,
JK_System_TimeZone
,
zoneCfg
,
strlen
(
zoneCfg
),
outBuffer
,
&
nInOutBufSize
,
3000
,
EXCMD_CONFIG_GET
);
if
(
res
<
0
){
qInfo
()
<<
QString
(
"SN(%1): FirstUserTimeZone 修改失败"
).
arg
(
sSn
);
qInfo
()
<<
"FirstUserTimeZone:修改失败"
;
}
res
=
XSDK_DevSynTime
(
hDevice
,
cTime
,
0
);
if
(
res
<
0
){
qInfo
()
<<
QString
(
"SN(%1): sdkDevSystemTimeZoneSyn修改失败"
).
arg
(
sSn
)
;
qInfo
()
<<
"sdkDevSystemTimeZoneSyn:修改失败"
;
}
}
//录像设置
void
CameraHandle
::
sdkRecordCfg
(
const
char
*
recordJson
){
qInfo
()
<<
recordJson
;
char
szOutBuffer
[
512
]
=
{
0
};
int
nLen
=
sizeof
(
szOutBuffer
);;
int
res
=
XSDK_DevSetSysConfigSyn
(
hDevice
,
JK_Record
,
recordJson
,
strlen
(
recordJson
),
szOutBuffer
,
&
nLen
,
3000
,
EXCMD_CONFIG_SET
);
if
(
res
<
0
){
qInfo
()
<<
QString
(
"SN(%1): sdkRecordCfg 录像设置->修改失败"
).
arg
(
sSn
);
qInfo
()
<<
"sdkRecordCfg 录像设置->修改失败"
<<
res
;
}
}
//配置编码设置
...
...
@@ -1358,24 +1028,16 @@ void CameraHandle::sdkEncodeCfg(const char* pCfg){
int
nLen
=
sizeof
(
szOutBuffer
);
int
res
=
XSDK_DevSetSysConfigSyn
(
hDevice
,
JK_Simplify_Encode
,
pCfg
,
strlen
(
pCfg
),
szOutBuffer
,
&
nLen
,
3000
,
EXCMD_CONFIG_SET
);
if
(
res
<
0
){
qInfo
()
<<
QString
(
"SN(%1): sdkEncodeCfg 配置编码设置->修改失败"
).
arg
(
sSn
);
qInfo
()
<<
"sdkEncodeCfg 配置编码设置->修改失败"
<<
res
;
}
}
int
CameraHandle
::
updateSdkDevStatus
(
bool
status
){
this
->
isOperateGb28181
.
store
(
true
,
std
::
memory_order_release
);
ScopeSemaphoreExit
streamGuard
([
this
]()
{
isOperateGb28181
.
store
(
false
,
std
::
memory_order_release
);
});
char
szOutBuffer
[
40960
]
=
{
0
};
int
nInOutSize
=
sizeof
(
szOutBuffer
);
int
res
=
XSDK_DevGetSysConfigSyn
(
hDevice
,
JK_NetWork_SPVMN
,
szOutBuffer
,
&
nInOutSize
,
4000
,
EXCMD_CONFIG_GET
);
if
(
res
<
0
){
qInfo
()
<<
QString
(
"SN(%1): GB28181可远程开关"
).
arg
(
sSn
);
qInfo
()
<<
sSn
<<
"GB28181可远程开关"
<<
res
;
return
0
;
}
XSDK_CFG
::
NetWork_SPVMN
config
;
...
...
@@ -1386,10 +1048,6 @@ int CameraHandle::updateSdkDevStatus(bool status){
return
res
;
}
void
CameraHandle
::
updateSdkDevSpvMn
(
vides_data
::
responseGb28181
*
gb28181
){
if
(
isOperateGb28181
.
load
(
std
::
memory_order_acquire
)){
qInfo
()
<<
QString
(
"SN(%1): mqtt正在操作GB28181"
).
arg
(
sSn
);
return
;
}
char
szOutBuffer
[
40960
]
=
{
0
};
int
nInOutSize
=
sizeof
(
szOutBuffer
);
int
res
=
XSDK_DevGetSysConfigSyn
(
hDevice
,
JK_NetWork_SPVMN
,
szOutBuffer
,
&
nInOutSize
,
4000
,
EXCMD_CONFIG_GET
);
...
...
@@ -1472,7 +1130,7 @@ void CameraHandle::sdkDevSpvMn(const char *spvMn){
int
nLen
=
sizeof
(
szOutBuffer
);
int
res
=
XSDK_DevSetSysConfigSyn
(
hDevice
,
JK_NetWork_SPVMN
,
spvMn
,
strlen
(
spvMn
),
szOutBuffer
,
&
nLen
,
3000
,
EXCMD_CONFIG_SET
);
if
(
res
<
0
){
qInfo
()
<<
sSn
<<
":
sdkDevSpvMn 28181->修改失败"
<<
res
;
qInfo
()
<<
"
sdkDevSpvMn 28181->修改失败"
<<
res
;
}
}
int
CameraHandle
::
deviceReboot
(){
...
...
@@ -1483,7 +1141,7 @@ int CameraHandle::deviceReboot(){
const
char
*
pCfg
=
cfg
.
ToString
();
nRet
=
XSDK_DevSetSysConfig
(
hDevice
,
JK_OPMachine
,
pCfg
,
strlen
(
pCfg
),
1
,
3000
,
EXCMD_SYSMANAGER_REQ
);
if
(
nRet
<
0
){
qInfo
()
<<
sSn
<<
"
:
重启相机失败"
<<
nRet
;
qInfo
()
<<
sSn
<<
"重启相机失败"
<<
nRet
;
return
0
;
}
QString
ip
=
QString
::
fromUtf8
(
loginParam
->
sDevId
);
...
...
@@ -1501,7 +1159,7 @@ int CameraHandle::deviceShutdown()
const
char
*
pCfg
=
cfg
.
ToString
();
nRet
=
XSDK_DevSetSysConfig
(
hDevice
,
JK_OPMachine
,
pCfg
,
strlen
(
pCfg
),
1
,
3000
,
EXCMD_SYSMANAGER_REQ
);
if
(
nRet
<
0
){
qInfo
()
<<
QString
(
"SN(%1): 设备关机失败:%2"
).
arg
(
sSn
).
arg
(
nRet
)
;
qInfo
()
<<
sSn
<<
"设备关机失败"
<<
nRet
;
return
0
;
}
...
...
CameraHandle.h
View file @
84806c68
...
...
@@ -31,7 +31,6 @@
#include <opencv2/opencv.hpp>
#include <QSemaphore>
#include <atomic>
#include <arpa/inet.h>
enum
CAR_INFORMATION
{
Exit
,
//出场
...
...
@@ -58,12 +57,11 @@ public:
void
clearCameraHandle
();
bool
distributionNetwork
(
QString
&
ip
);
// void rebindTimer(int hDevice);
//相机参数更新
void
cameraParameterUpdate
(
vides_data
::
responseConfig
&
cloudConfig
);
void
initSdkRealTimeDevSnapSyn
(
int
syn_timer
,
uint64
face_frequency
);
void
initSdkRealTimeDevSnapSyn
(
int
hDevice
,
int
syn_timer
,
uint64
face_frequency
);
void
notificationUpdateImageMap
(
std
::
map
<
QString
,
QString
>&
maps
,
int
numberFaces
,
float
confidence
);
...
...
@@ -87,17 +85,10 @@ public:
void
printWifi
(
XSDK_HANDLE
hDevice
,
XSDK_CFG
::
NetWork_Wifi
&
cfg
);
bool
isWifiConnect
(
XSDK_HANDLE
hDevice
,
XSDK_CFG
::
NetWork_Wifi
&
cfg
);
void
setCarConfidenceMaxAndMin
(
float
carConfidenceMax
,
float
carConfidenceMin
);
QString
DecIpToHexIp
(
const
QString
&
decIp
);
//修改相机IP
bool
wifiChangeIp
(
QString
&
Ip
,
bool
is_connect
,
int
h_device
);
//设置相机连接的wifi
bool
sdkWifi
(
QString
&
pwd
,
QString
&
ssid
);
void
sdkWifi
(
QString
&
pwd
,
QString
&
ssid
);
//时间设置
void
sdkDevSystemTimeZoneSyn
(
QString
&
time
);
//录像设置
...
...
@@ -116,11 +107,7 @@ public:
int
deviceShutdown
();
//获取固件版本
void
findFirmwareVersion
(
QString
&
firmwareVersion
);
//复位GB28181
int
resetGb28181
();
//修改相机ip
bool
changeCameraIp
(
QString
&
reachableIp
);
//获取ip
void
findIp
(
QString
&
ip
);
...
...
@@ -140,10 +127,6 @@ public:
void
setMediaHandle
(
int
mediaHandle
);
void
initAlgorithmPermissions
(
__uint8_t
algorithm
);
void
initFaceFrequency
(
uint64
face_frequency
);
void
initParkingSpaceInfo
(
const
std
::
list
<
vides_data
::
responseArea
>&
areas
);
bool
compareLists
(
const
std
::
list
<
vides_data
::
responseArea
>&
newAreas
);
...
...
@@ -175,7 +158,7 @@ signals:
void
afterDownloadFile
(
int
id
,
int
recognitionType
,
QString
ossUrl
);
private
slots
:
void
sdkRealTimeDevSnapSyn
();
void
sdkRealTimeDevSnapSyn
(
int
hDevice
);
void
pushRecordToCloud
(
int
id
,
int
recognitionType
,
QString
ossUrl
);
//void releaseSemaphore();
...
...
@@ -212,9 +195,6 @@ private :
int
image_save
;
std
::
atomic
<
uint64
>
faceCount
;
std
::
atomic
<
bool
>
isOperateGb28181
{
false
};
uint64
face_frequency
;
__uint8_t
algorithmPermissions
;
...
...
Common.cpp
View file @
84806c68
...
...
@@ -24,7 +24,7 @@ QString Common::generateSignature(const QString& accessKeySecret, const QString&
date
+
"
\n
"
+
ossHeaders
+
"
\n
"
+
// 添加'\n'分隔符,并确保ossHeaders末尾没有多余的空白
canonicalizedResource
;
// 将密钥和消息转换为字节数组
QByteArray
hmacKey
=
accessKeySecret
.
toUtf8
();
QByteArray
message
=
stringToSign
.
toUtf8
();
...
...
@@ -32,10 +32,10 @@ QString Common::generateSignature(const QString& accessKeySecret, const QString&
QMessageAuthenticationCode
mac
(
QCryptographicHash
::
Sha1
);
mac
.
setKey
(
hmacKey
);
mac
.
addData
(
message
);
QByteArray
signature
=
mac
.
result
().
toBase64
();
// 直接使用QMessageAuthenticationCode的结果
return
QString
(
signature
);
}
QString
Common
::
getVideoOut
(){
...
...
@@ -62,8 +62,6 @@ void Common::setImages(QString images){
images
.
append
(
"/"
);
this
->
images
=
images
;
}
QString
Common
::
GetLocalIp
()
{
QString
ipAddress
;
QList
<
QHostAddress
>
list
=
QNetworkInterface
::
allAddresses
();
...
...
Common.h
View file @
84806c68
...
...
@@ -10,7 +10,7 @@
#include <QCryptographicHash>
#include <QMessageAuthenticationCode>
#include <QNetworkInterface>
#include <map>
#include <QDebug>
class
Common
{
...
...
@@ -38,7 +38,6 @@ public:
QString
getVideoDownload
();
void
setVideoDownload
(
QString
videoDownload
);
QString
getImages
();
void
setImages
(
QString
images
);
...
...
@@ -62,7 +61,6 @@ private:
QString
videoOut
;
QString
videoDownload
;
QString
images
;
Common
();
~
Common
();
...
...
FaceReconitionHandle.cpp
View file @
84806c68
...
...
@@ -192,7 +192,7 @@ cv::Mat FaceReconitionHandle::loadImageFromByteStream(const QString& filePath) {
void
FaceReconitionHandle
::
doesItExistEmployee
(
const
QString
&
sn
,
const
cv
::
Mat
&
source
,
std
::
list
<
vides_data
::
faceRecognitionResult
>&
faces
){
void
FaceReconitionHandle
::
doesItExistEmployee
(
const
cv
::
Mat
&
source
,
std
::
list
<
vides_data
::
faceRecognitionResult
>&
faces
){
thread_time
.
store
(
QDateTime
::
currentMSecsSinceEpoch
(),
std
::
memory_order_release
);
ScopeSemaphoreExit
streamGuard
([
this
]()
{
isRunning
.
store
(
false
,
std
::
memory_order_release
);
...
...
@@ -211,14 +211,14 @@ void FaceReconitionHandle::doesItExistEmployee(const QString &sn,const cv::Mat &
ret
=
HF_CreateImageStream
(
&
imageData
,
&
imageSteamHandle
);
if
(
ret
!=
HSUCCEED
)
{
qInfo
()
<<
QString
(
"
SN(%1): image handle error:%2"
).
arg
(
sn
).
arg
((
long
)
imageSteamHandle
,
0
,
10
);
qInfo
()
<<
QString
(
"
image handle error:%1"
).
arg
((
long
)
imageSteamHandle
,
0
,
10
);
return
;
}
HF_MultipleFaceData
multipleFaceData
=
{
0
};
HF_FaceContextRunFaceTrack
(
ctxHandle
,
imageSteamHandle
,
&
multipleFaceData
);
if
(
multipleFaceData
.
detectedNum
<=
0
)
{
qInfo
()
<<
QString
(
"
SN(%1): 未检测到人脸"
).
arg
(
sn
);
qInfo
()
<<
QString
(
"
search 未检测到人脸"
);
return
;
}
...
...
@@ -227,12 +227,11 @@ void FaceReconitionHandle::doesItExistEmployee(const QString &sn,const cv::Mat &
HInt32
featureNum
;
HF_GetFeatureLength
(
ctxHandle
,
&
featureNum
);
for
(
int
j
=
0
;
j
<
multipleFaceData
.
detectedNum
;
++
j
){
//qInfo()<<QString("doesItExistEmployee==>面部索引: %1").arg(j);
qDebug
()
<<
QString
(
"SN(%1): 面部索引:%2"
).
arg
(
sn
).
arg
(
j
);
qInfo
()
<<
QString
(
"doesItExistEmployee==>面部索引: %1"
).
arg
(
j
);
std
::
vector
<
float
>
newfeature
(
featureNum
,
0.0
f
);
ret
=
HF_FaceFeatureExtractCpy
(
ctxHandle
,
imageSteamHandle
,
multipleFaceData
.
tokens
[
j
],
newfeature
.
data
());
if
(
ret
!=
HSUCCEED
)
{
qInfo
()
<<
QString
(
"SN(%1): 特征提取出错:%2"
).
arg
(
sn
).
arg
(
ret
);
qInfo
()
<<
QString
(
"特征提取出错: %1"
).
arg
(
ret
);
HF_ReleaseImageStream
(
imageSteamHandle
);
return
;
}
...
...
@@ -249,12 +248,13 @@ void FaceReconitionHandle::doesItExistEmployee(const QString &sn,const cv::Mat &
HFloat
confidence
;
ret
=
HF_FeaturesGroupFeatureSearch
(
ctxHandle
,
feature
,
&
confidence
,
&
searchIdentity
);
if
(
ret
!=
HSUCCEED
)
{
qInfo
()
<<
QString
(
"SN(%1): 搜索失败:%2"
).
arg
(
sn
).
arg
(
ret
);
qInfo
()
<<
QString
(
"搜索失败: %1"
).
arg
(
ret
);
return
;
}
qInfo
()
<<
QString
(
"SN(%1): 搜索置信度:%2"
).
arg
(
sn
).
arg
(
confidence
);
qInfo
()
<<
QString
(
"SN(%1): 匹配到的tag:%2"
).
arg
(
sn
).
arg
(
searchIdentity
.
tag
);
qInfo
()
<<
QString
(
"SN(%1): 匹配到的customId:%2"
).
arg
(
sn
).
arg
(
searchIdentity
.
customId
);
qInfo
()
<<
QString
(
"搜索置信度: %1"
).
arg
(
confidence
);
qInfo
()
<<
QString
(
"匹配到的tag: %1"
).
arg
(
searchIdentity
.
tag
);
qInfo
()
<<
QString
(
"匹配到的customId: %1"
).
arg
(
searchIdentity
.
customId
);
// Face Pipeline
//printf("人脸特征数量: %d", faceNum);
if
(
confidence
>
configConfidence
)
{
...
...
@@ -275,7 +275,7 @@ void FaceReconitionHandle::doesItExistEmployee(const QString &sn,const cv::Mat &
// printf("image released");
}
else
{
//printf("image release error: %ld", ret);
qInfo
()
<<
QString
(
"SN(%1): image release error:%2"
).
arg
(
sn
).
arg
(
ret
);
qInfo
()
<<
QString
(
"image release error: %1"
).
arg
(
ret
);
}
}
FaceReconitionHandle.h
View file @
84806c68
...
...
@@ -33,7 +33,7 @@ public:
void
setImageChanged
(
bool
imageChanged
);
void
doesItExistEmployee
(
const
QString
&
sn
,
const
cv
::
Mat
&
source
,
std
::
list
<
vides_data
::
faceRecognitionResult
>&
face
);
void
doesItExistEmployee
(
const
cv
::
Mat
&
source
,
std
::
list
<
vides_data
::
faceRecognitionResult
>&
face
);
void
initSourceImageMap
(
std
::
map
<
QString
,
QString
>&
maps
,
int
numberFaces
,
float
confidence
);
...
...
HttpService.cpp
View file @
84806c68
...
...
@@ -161,7 +161,7 @@ vides_data::response *HttpService::httpFindCameras(QString &serialNumber,vides_d
}
else
{
qInfo
()
<<
m_httpClient
.
errorCode
();
resp
->
code
=
2
;
resp
->
msg
=
m_httpClient
.
errorCode
()
;
resp
->
msg
=
OPERATION_FAILED
;
}
return
resp
;
}
...
...
@@ -354,6 +354,11 @@ vides_data::response *HttpService::httpPostFacePopulation(QByteArray &img,int &h
resp
->
code
=
map
[
"code"
].
toInt
();
resp
->
msg
=
map
[
"message"
].
toString
();
}
else
{
qInfo
()
<<
"httpPostFacePopulation===>"
;
qInfo
()
<<
m_httpClient
.
errorCode
();
qInfo
()
<<
m_httpClient
.
errorString
();
qInfo
()
<<
"httpPostFacePopulation===>end"
;
resp
->
code
=
2
;
resp
->
msg
=
m_httpClient
.
errorCode
();
}
...
...
@@ -506,6 +511,7 @@ vides_data::response *HttpService::httpDeviceConfig(const QString &serialNumber,
QJsonObject
faceConfigObj
=
dataObj
[
"faceConfig"
].
toObject
();
config
.
faceConfig
.
isOn
=
faceConfigObj
[
"isOn"
].
toBool
();
config
.
faceConfig
.
faceNumbers
=
faceConfigObj
[
"faceNumbers"
].
toInt
();
config
.
faceConfig
.
faceFrequency
=
faceConfigObj
[
"faceFrequency"
].
toInt
();
config
.
faceConfig
.
confidence
=
faceConfigObj
[
"confidence"
].
toVariant
().
toFloat
();
config
.
faceConfig
.
updateAt
=
faceConfigObj
[
"updateAt"
].
toVariant
().
toULongLong
();
config
.
faceConfig
.
faceLen
=
faceConfigObj
[
"faceLen"
].
toInt
();
...
...
@@ -536,7 +542,6 @@ vides_data::response *HttpService::httpDeviceConfig(const QString &serialNumber,
QJsonObject
humanConfigObj
=
dataObj
[
"humanConfig"
].
toObject
();
config
.
humanConfig
.
isOn
=
humanConfigObj
[
"isOn"
].
toBool
();
config
.
humanConfig
.
updateAt
=
humanConfigObj
[
"updateAt"
].
toVariant
().
toULongLong
();
config
.
humanConfig
.
faceFrequency
=
humanConfigObj
[
"faceFrequency"
].
toVariant
().
toUInt
();
// 解析 devicesConfig
QJsonObject
devicesConfigObj
=
dataObj
[
"camera"
].
toObject
();
...
...
Httpclient.cpp
View file @
84806c68
...
...
@@ -7,7 +7,7 @@ HttpClient::HttpClient(QObject *parent)
{
m_networkAccessManager
=
new
QNetworkAccessManager
(
this
);
m_timer
=
new
QTimer
(
this
);
m_timer
->
setInterval
(
8
000
);
m_timer
->
setInterval
(
6
000
);
m_timer
->
setSingleShot
(
true
);
connect
(
m_timer
,
SIGNAL
(
timeout
()),
&
m_eventLoop
,
SLOT
(
quit
()));
}
...
...
HumanDetection.cpp
View file @
84806c68
...
...
@@ -77,7 +77,7 @@ void HumanDetection::setHuManParameter(int &uniformColor){
}
//0 人形 1 车形 2 工服
int
HumanDetection
::
findHuManCar
(
const
cv
::
Mat
&
source
,
int
res
,
std
::
map
<
int
,
int
>&
reMap
,
QString
&
sSn
,
float
&
heightReference
,
std
::
vector
<
vides_data
::
ParkingArea
>
&
currentPlate
)
{
int
HumanDetection
::
findHuManCar
(
const
cv
::
Mat
&
source
,
int
res
,
std
::
map
<
int
,
int
>&
reMap
,
float
&
heightReference
,
std
::
vector
<
vides_data
::
ParkingArea
>
&
currentPlate
)
{
thread_time
.
store
(
QDateTime
::
currentMSecsSinceEpoch
(),
std
::
memory_order_release
);
TCV_CameraStream
*
stream
=
TCV_CreateCameraStream
();
...
...
@@ -100,7 +100,8 @@ int HumanDetection::findHuManCar(const cv::Mat &source, int res,std::map<int,int
if
(
res
==
0x00
||
res
==
0x02
)
{
num
=
TCV_HumanDetectorGetNumOfHuman
(
detector
);
qInfo
()
<<
QString
(
"SN(%1): 获取人形数量:%2"
).
arg
(
sSn
).
arg
(
num
);
qInfo
()
<<
"TCV_HumanDetectorGetNumOfHuman==>"
<<
num
;
if
(
num
==
0
)
return
num
;
// 无行人检测结果,提前返回
std
::
vector
<
TCV_ObjectLocation
>
results
(
num
);
TCV_HumanDetectorGetHumanLocation
(
detector
,
results
.
data
(),
num
);
...
...
@@ -132,6 +133,8 @@ int HumanDetection::findHuManCar(const cv::Mat &source, int res,std::map<int,int
}
reMap
[
0x02
]
=
count_no_uniform
;
// 未穿工服的行人数量
reMap
[
0x00
]
=
count_all
;
// 所有满足条件的行人数量
qInfo
()
<<
"count_all==>"
<<
count_all
;
qInfo
()
<<
"count_no_uniform==>"
<<
count_no_uniform
;
num
=
(
res
==
0x00
)
?
count_all
:
count_no_uniform
;
}
...
...
HumanDetection.h
View file @
84806c68
...
...
@@ -16,7 +16,7 @@ public:
float
carShapeConfidence
);
~
HumanDetection
();
int
findHuManCar
(
const
cv
::
Mat
&
source
,
int
res
,
std
::
map
<
int
,
int
>&
reMap
,
QString
&
sSn
,
int
findHuManCar
(
const
cv
::
Mat
&
source
,
int
res
,
std
::
map
<
int
,
int
>&
reMap
,
float
&
heightReference
,
std
::
vector
<
vides_data
::
ParkingArea
>
&
currentPlate
);
void
setHuManParameter
(
int
&
uniformColor
);
...
...
LicensePlateRecognition.cpp
View file @
84806c68
...
...
@@ -82,6 +82,7 @@ void LicensePlateRecognition::oldLicensePlateNumber(const cv::Mat &source,const
}
else
{
type
=
types
[
results
.
plates
[
i
].
type
];
}
qInfo
()
<<
QString
(
"车牌号:%1"
).
arg
(
results
.
plates
[
i
].
code
);
QString
plateResult
=
QString
(
"第%1个,%2,车牌号:%3,置信度:%4,左上角点x坐标:%5,左上角点y坐标:%6,右下角点x坐标:%7,右下角点y坐标:%8"
)
.
arg
(
i
+
1
).
arg
(
type
.
c_str
()).
arg
(
results
.
plates
[
i
].
code
)
.
arg
(
results
.
plates
[
i
].
text_confidence
).
arg
(
results
.
plates
[
i
].
x1
,
0
,
'Q'
,
4
)
...
...
@@ -167,6 +168,7 @@ void LicensePlateRecognition::licensePlateNumber(const cv::Mat &source, QString
newPlate
.
new_color
=
QString
::
fromStdString
(
type
);
QString
car_nuber
=
QString
::
fromUtf8
(
results
.
plates
[
i
].
code
);
replaceWith1And0
(
car_nuber
);
qInfo
()
<<
"I O (i o)大小写替换为 1 0结果:==>"
<<
car_nuber
;
newPlate
.
new_plate
=
car_nuber
;
newPlate
.
text_confidence
=
results
.
plates
[
i
].
text_confidence
;
vides_data
::
ParkingArea
area
;
...
...
LogHandle.h
View file @
84806c68
...
...
@@ -12,7 +12,7 @@
#include <QTextStream>
#include <QTextCodec>
const
int
g_logLimitSize
=
4
5
;
const
int
g_logLimitSize
=
5
;
struct
LogHandlerPrivate
{
LogHandlerPrivate
();
...
...
LogHandler.cpp
View file @
84806c68
...
...
@@ -25,13 +25,13 @@ LogHandlerPrivate::LogHandlerPrivate() {
openAndBackupLogFile
();
// 十分钟检查一次日志文件创建时间
renameLogFileTimer
.
setInterval
(
1000
*
60
*
10
);
// TODO: 可从配置文件读取
renameLogFileTimer
.
setInterval
(
1000
*
2
);
// TODO: 可从配置文件读取
renameLogFileTimer
.
start
();
QObject
::
connect
(
&
renameLogFileTimer
,
&
QTimer
::
timeout
,
[
this
]
{
QMutexLocker
locker
(
&
LogHandlerPrivate
::
logMutex
);
openAndBackupLogFile
();
// 打开日志文件
checkLogFiles
();
// 检测当前日志文件大小
// autoDeleteLog(); // 自动删除30天前的日志
// autoDeleteLog(); // 自动删除30天前的日志
});
// 定时刷新日志输出到文件,尽快的能在日志文件里看到最新的日志
...
...
@@ -91,17 +91,10 @@ void LogHandlerPrivate::openAndBackupLogFile() {
logFile
->
close
();
delete
logOut
;
delete
logFile
;
QDate
renameDate
=
logFileCreatedDate
;
if
(
logFileCreatedDate
==
QDate
::
currentDate
())
{
renameDate
=
QDate
::
currentDate
().
addDays
(
-
1
);
// 设置为昨天的日期
}
QString
newLogPath
=
logDir
.
absoluteFilePath
(
rename
Date
.
toString
(
"yyyy-MM-dd.log"
));
//
QFile::rename(logPath, newLogPath); // 将原始日志文件重命名为新的文件名
QString
newLogPath
=
logDir
.
absoluteFilePath
(
logFileCreated
Date
.
toString
(
"yyyy-MM-dd.log"
));
QFile
::
rename
(
logPath
,
newLogPath
);
// 将原始日志文件重命名为新的文件名
QFile
::
copy
(
logPath
,
newLogPath
);
QFile
::
remove
(
logPath
);
logFile
=
new
QFile
(
logPath
);
logOut
=
(
logFile
->
open
(
QIODevice
::
WriteOnly
|
QIODevice
::
Text
|
QIODevice
::
Append
))
?
new
QTextStream
(
logFile
)
:
nullptr
;
logFileCreatedDate
=
QDate
::
currentDate
();
...
...
@@ -112,8 +105,8 @@ void LogHandlerPrivate::openAndBackupLogFile() {
// 检测当前日志文件大小
void
LogHandlerPrivate
::
checkLogFiles
()
{
// 如果 protocal.log 文件大小超过5
5
M,重新创建一个日志文件,原文件存档为yyyy-MM-dd_hhmmss.log
if
(
logFile
->
size
()
>
1024
*
1024
*
g_logLimitSize
)
{
// 如果 protocal.log 文件大小超过5M,重新创建一个日志文件,原文件存档为yyyy-MM-dd_hhmmss.log
if
(
logFile
->
size
()
>
1024
*
g_logLimitSize
)
{
logFile
->
flush
();
logFile
->
close
();
delete
logOut
;
...
...
@@ -121,11 +114,7 @@ void LogHandlerPrivate::checkLogFiles() {
QString
logPath
=
logDir
.
absoluteFilePath
(
"today.log"
);
// 日志的路径
QString
newLogPath
=
logDir
.
absoluteFilePath
(
logFileCreatedDate
.
toString
(
"yyyy-MM-dd.log"
));
// QFile::rename(logPath, newLogPath);
QFile
::
copy
(
logPath
,
newLogPath
);
QFile
::
remove
(
logPath
);
QFile
::
rename
(
logPath
,
newLogPath
);
logFile
=
new
QFile
(
logPath
);
logOut
=
(
logFile
->
open
(
QIODevice
::
WriteOnly
|
QIODevice
::
Text
|
QIODevice
::
Append
))
?
new
QTextStream
(
logFile
)
:
NULL
;
logFileCreatedDate
=
QDate
::
currentDate
();
...
...
MediaFaceImage.cpp
View file @
84806c68
...
...
@@ -62,7 +62,7 @@ static int sdkInitCallback(XSDK_HANDLE hObject, int nMsgId, int nParam1,
auto
taskCallBack
=
std
::
bind
(
&
CameraHandle
::
callbackFunction
,
cameraHandle
,
hObject
,
qString
);
auto
taskRunnable
=
new
TaskRunnable
(
taskCallBack
,
hObject
,
cameraHandle
->
getChannel
(),
RunFunction
::
SdkCallbackFunction
);
threadPool
->
start
(
taskRunnable
);
}
}
break
;
...
...
@@ -92,8 +92,8 @@ int MediaFaceImage::SdkSearchDevicesSyn(std::map<QString, vides_data::localDevic
for
(
int
i
=
0
;
i
<
nActualCount
;
i
++
)
{
qInfo
()
<<
QString
(
"[%1][IP:%2.%3.%4.%5][SN:%6][Mac:%7]"
)
.
arg
(
i
)
.
arg
(
pRet
[
i
].
HostIP
.
c
[
0
])
.
arg
(
i
)
.
arg
(
pRet
[
i
].
HostIP
.
c
[
0
])
.
arg
(
pRet
[
i
].
HostIP
.
c
[
1
])
.
arg
(
pRet
[
i
].
HostIP
.
c
[
2
])
.
arg
(
pRet
[
i
].
HostIP
.
c
[
3
])
...
...
@@ -230,54 +230,54 @@ int MediaFaceImage::ToFile(const char* pFileName, const void* pData, int nLength
// return pInOutBufferSize; // pOutBuffer由智能指针管理,此处无需手动释放
//}
int
MediaFaceImage
::
FaceImageCallBack
(
XSDK_HANDLE
hMedia
,
int
nChannel
,
cv
::
Mat
&
image
,
QString
&
sSn
)
{
int
MediaFaceImage
::
FaceImageCallBack
(
XSDK_HANDLE
hMedia
,
int
nChannel
,
cv
::
Mat
&
image
)
{
const
int
BufferSize
=
1024
*
1024
*
2
;
// 缓冲区大小
image
.
release
();
// 释放之前的图像
std
::
unique_ptr
<
unsigned
char
[]
>
pOutBuffer
(
new
unsigned
char
[
BufferSize
]);
// 智能指针管理内存
int
pInOutBufferSize
=
0
;
int
ret
=
XSDK_DevSnapSyn
(
hMedia
,
nChannel
,
""
,
pOutBuffer
.
get
(),
&
pInOutBufferSize
);
if
(
ret
<
0
||
pInOutBufferSize
<=
0
)
{
qInfo
()
<<
QString
(
"SN(%1): 同步设备端抓图失败"
).
arg
(
sSn
);
;
qInfo
()
<<
"同步设备端抓图失败"
;
return
-
1
;
}
// 使用 std::vector 管理缓冲区数据
std
::
vector
<
uchar
>
buffer
(
pInOutBufferSize
);
memcpy
(
buffer
.
data
(),
pOutBuffer
.
get
(),
pInOutBufferSize
);
try
{
cv
::
Mat
decodedImage
=
cv
::
imdecode
(
buffer
,
cv
::
IMREAD_UNCHANGED
);
if
(
decodedImage
.
empty
())
{
qInfo
()
<<
QString
(
"SN(%1): 图像解码失败"
).
arg
(
sSn
);
;
qInfo
()
<<
"图像解码失败"
;
return
-
1
;
}
image
=
std
::
move
(
decodedImage
);
}
catch
(
const
cv
::
Exception
&
e
)
{
qInfo
()
<<
QString
(
"SN(%1): 图像解码过程中捕获异常:%2"
).
arg
(
sSn
).
arg
(
e
.
what
());
qInfo
()
<<
"图像解码过程中捕获异常:"
<<
e
.
what
();
return
-
1
;
}
return
pInOutBufferSize
;
}
int
MediaFaceImage
::
CameraImage
(
XSDK_HANDLE
hMedia
,
int
nChannel
,
std
::
vector
<
uchar
>
&
buffer
){
static
const
int
BufferSize
=
1024
*
1024
*
2
;
// 2MB buffer size
static
unsigned
char
pOutBuffer
[
BufferSize
];
// 初始化为0,用于接收实际填充的大小
int
pInOutBufferSize
=
0
;
// 尝试从设备获取快照数据
int
ret
=
XSDK_DevSnapSyn
(
hMedia
,
nChannel
,
""
,
pOutBuffer
,
&
pInOutBufferSize
);
if
(
ret
<
0
||
pInOutBufferSize
<=
0
)
{
qInfo
()
<<
"同步设备端抓图失败"
;
return
-
1
;
// 返回-1表示失败
}
// 用pOutBuffer里的数据初始化vector,复制数据到vector中
buffer
=
std
::
vector
<
uchar
>
(
pOutBuffer
,
pOutBuffer
+
pInOutBufferSize
);
// 返回实际填入Vector的数据大小
return
pInOutBufferSize
;
}
...
...
MediaFaceImage.h
View file @
84806c68
...
...
@@ -18,7 +18,7 @@ public:
static
MediaFaceImage
*
getInstance
();
// 单例模式获取实例的静态成员函数
void
ParserImageData
(
const
unsigned
char
*
pData
,
int
nDataLen
,
char
*
pJpg
,
int
*
nJpgLen
,
char
*
pJson
);
int
FaceImageCallBack
(
XSDK_HANDLE
hMedia
,
int
nChannel
,
cv
::
Mat
&
image
,
QString
&
sSn
);
int
FaceImageCallBack
(
XSDK_HANDLE
hMedia
,
int
nChannel
,
cv
::
Mat
&
image
);
int
CameraImage
(
XSDK_HANDLE
hMedia
,
int
nChannel
,
std
::
vector
<
uchar
>
&
buffer
);
int
ToFile
(
const
char
*
pFileName
,
const
void
*
pData
,
int
nLenght
);
...
...
MqttSubscriber.cpp
View file @
84806c68
...
...
@@ -24,29 +24,29 @@ void MqttSubscriber::init(vides_data::MqttConfig &config, QString &httpUrl, QStr
qInfo
()
<<
"客户端断开连接失败,返回编码"
<<
rc
;
}
}
// 销毁现有的MQTT客户端
MQTTAsync_destroy
(
&
client
);
client
=
nullptr
;
// 重置客户端指针
}
// 保存配置信息
this
->
config
=
config
;
this
->
httpUrl
=
httpUrl
;
this
->
serialNumber
=
serialNumber
;
// 初始化新的MQTT客户端
QByteArray
bAddress
=
config
.
address
.
toUtf8
();
char
*
cAddress
=
bAddress
.
data
();
QByteArray
bClientId
=
config
.
clientId
.
toUtf8
();
char
*
cClientId
=
bClientId
.
data
();
int
rc
=
MQTTAsync_create
(
&
client
,
cAddress
,
cClientId
,
MQTTCLIENT_PERSISTENCE_NONE
,
nullptr
);
if
(
rc
!=
MQTTASYNC_SUCCESS
)
{
qInfo
()
<<
"MQTT客户端创建失败,返回编码"
<<
rc
;
return
;
}
// 设置回调函数
MQTTAsync_setCallbacks
(
client
,
this
,
[](
void
*
context
,
char
*
cause
)
{
static_cast
<
MqttSubscriber
*>
(
context
)
->
connectionLost
(
cause
);
...
...
@@ -57,7 +57,7 @@ void MqttSubscriber::init(vides_data::MqttConfig &config, QString &httpUrl, QStr
MqttSubscriber
::
MqttSubscriber
(
QObject
*
parent
)
:
QObject
(
parent
),
retryTimer
(
new
QTimer
(
this
)),
client
(
nullptr
)
{
// 连接信号和槽
connect
(
this
,
&
MqttSubscriber
::
connectionLostSignal
,
this
,
&
MqttSubscriber
::
reconnectAndFetchConfig
,
Qt
::
QueuedConnection
);
retryTimer
->
setInterval
(
10000
);
// 设置重试间隔为10秒
...
...
@@ -76,18 +76,18 @@ MqttSubscriber::~MqttSubscriber() {
void
MqttSubscriber
::
start
()
{
// 确保定时器停止
retryTimer
->
stop
();
// 设置连接选项
MQTTAsync_connectOptions
conn_opts
=
MQTTAsync_connectOptions_initializer
;
conn_opts
.
keepAliveInterval
=
20
;
conn_opts
.
cleansession
=
1
;
QByteArray
bUsername
=
config
.
username
.
toUtf8
();
char
*
cUsername
=
bUsername
.
data
();
QByteArray
bPassword
=
config
.
password
.
toUtf8
();
char
*
cPassword
=
bPassword
.
data
();
conn_opts
.
username
=
cUsername
;
conn_opts
.
password
=
cPassword
;
conn_opts
.
onSuccess
=
[](
void
*
context
,
MQTTAsync_successData
*
response
)
{
...
...
@@ -97,7 +97,7 @@ void MqttSubscriber::start() {
static_cast
<
MqttSubscriber
*>
(
context
)
->
onConnectFailure
(
response
);
};
conn_opts
.
context
=
this
;
// 启动连接
int
rc
;
if
((
rc
=
MQTTAsync_connect
(
client
,
&
conn_opts
))
!=
MQTTASYNC_SUCCESS
)
{
...
...
@@ -116,7 +116,7 @@ void MqttSubscriber::onConnect(MQTTAsync_successData* response) {
static_cast
<
MqttSubscriber
*>
(
context
)
->
onSubscribeFailure
(
response
);
};
opts
.
context
=
this
;
QByteArray
bTopic
=
config
.
topic
.
toUtf8
();
char
*
cTopic
=
bTopic
.
data
();
int
rc
;
...
...
@@ -129,7 +129,7 @@ void MqttSubscriber::reconnectAndFetchConfig() {
qInfo
()
<<
"重新连接并获取配置"
;
Common
&
instace
=
Common
::
getInstance
();
vides_data
::
responseConfig
re_config
;
// 使用 HttpService 从远程云端拉取配置
HttpService
httpService
(
httpUrl
);
// 替换为实际的远程URL
vides_data
::
response
*
res
=
httpService
.
httpDeviceConfig
(
serialNumber
,
re_config
);
...
...
@@ -174,7 +174,7 @@ void MqttSubscriber::connectionLost(char* cause) {
int
MqttSubscriber
::
messageArrived
(
char
*
topicName
,
int
topicLen
,
MQTTAsync_message
*
m
)
{
QString
topic
(
topicName
);
QString
payload
=
QString
::
fromUtf8
(
reinterpret_cast
<
const
char
*>
(
m
->
payload
),
m
->
payloadlen
);
QJsonObject
msgBodyOb
;
vides_data
::
responseMqttData
response
;
QJsonDocument
jsonDoc
=
QJsonDocument
::
fromJson
(
payload
.
toUtf8
());
if
(
!
jsonDoc
.
isNull
()
&&
jsonDoc
.
isObject
())
{
...
...
@@ -182,21 +182,10 @@ int MqttSubscriber::messageArrived(char* topicName, int topicLen, MQTTAsync_mess
response
.
msg_type
=
jsonObj
[
"msg_type"
].
toInt
();
response
.
sn
=
jsonObj
[
"sn"
].
toString
();
response
.
uniq
=
jsonObj
[
"uniq"
].
toString
();
// 解析 msg_body 字段
if
(
jsonObj
.
contains
(
"msg_body"
))
{
QString
msgBodyStr
=
jsonObj
[
"msg_body"
].
toString
();
// 将 msg_body 字符串转换为 QJsonDocument
QJsonDocument
msgBodyDoc
=
QJsonDocument
::
fromJson
(
msgBodyStr
.
toUtf8
());
if
(
!
msgBodyDoc
.
isNull
()
&&
msgBodyDoc
.
isObject
())
{
msgBodyOb
=
msgBodyDoc
.
object
();
}
else
{
qInfo
()
<<
"Failed to parse msg_body as a JSON object."
;
}
}
}
else
{
qInfo
()
<<
"Failed to parse JSON payload"
;
}
//1开 2关 3 重启 4 GB28181开 5 GB28181 关 6 一键配网 7 WIFI配留 8 复位GB28181
int
res
=
-
2
;
CameraHandle
*
cameraHandle
=
MainWindow
::
sp_this
->
findHandle
(
response
.
sn
);
if
(
cameraHandle
==
nullptr
)
{
...
...
@@ -211,64 +200,38 @@ int MqttSubscriber::messageArrived(char* topicName, int topicLen, MQTTAsync_mess
res
=
cameraHandle
->
updateSdkDevStatus
(
true
);
}
else
if
(
response
.
msg_type
==
5
)
{
res
=
cameraHandle
->
updateSdkDevStatus
(
false
);
}
else
if
(
response
.
msg_type
==
6
)
{
QString
ipAddress
;
// 提取 ip 地址
if
(
msgBodyOb
.
contains
(
"ip"
)
&&
msgBodyOb
[
"ip"
].
isString
())
{
ipAddress
=
msgBodyOb
[
"ip"
].
toString
();
qInfo
()
<<
"IP Address: "
<<
ipAddress
;
}
else
{
qInfo
()
<<
"IP address not found in msg_body."
;
}
res
=
cameraHandle
->
distributionNetwork
(
ipAddress
);
}
else
if
(
response
.
msg_type
==
7
)
{
// 提取 ip 地址
if
(
msgBodyOb
.
contains
(
"username"
)
&&
msgBodyOb
.
contains
(
"password"
))
{
QString
username
=
msgBodyOb
[
"username"
].
toString
();
QString
password
=
msgBodyOb
[
"password"
].
toString
();
res
=
(
cameraHandle
->
sdkWifi
(
password
,
username
)
==
true
?
0
:
0x01
);
}
else
{
qInfo
()
<<
"IP username not found in msg_body."
;
qInfo
()
<<
"IP password not found in msg_body."
;
}
}
else
if
(
response
.
msg_type
==
8
)
{
res
=
(
cameraHandle
->
resetGb28181
()
==
true
?
0
:
0x01
);
}
}
vides_data
::
requestMqttData
request
;
request
.
code
=
(
res
>=
0
)
?
0
:
0x01
;
request
.
msg
=
(
res
>=
0
)
?
"成功"
:
"失败"
;
request
.
uniq
=
response
.
uniq
;
sendSubscriptionConfirmation
(
request
,
response
.
sn
);
request
.
uniq
=
response
.
uniq
;
request
.
sn
=
response
.
sn
;
sendSubscriptionConfirmation
(
request
);
MQTTAsync_freeMessage
(
&
m
);
MQTTAsync_free
(
topicName
);
return
1
;
}
void
MqttSubscriber
::
sendSubscriptionConfirmation
(
const
vides_data
::
requestMqttData
&
response
,
QString
&
sn
)
{
QString
responseTopic
=
"/thingshub/"
+
response
.
uniq
+
"/device/post"
;
void
MqttSubscriber
::
sendSubscriptionConfirmation
(
const
vides_data
::
requestMqttData
&
response
)
{
QString
responseTopic
=
"/thingshub/"
+
response
.
sn
+
"/device/post"
;
QByteArray
bResponseTopic
=
responseTopic
.
toUtf8
();
char
*
cResponseTopic
=
bResponseTopic
.
data
();
qInfo
()
<<
QString
(
"SN(%1): sendSubscriptionConfirmation->cResponseTopic%2"
).
arg
(
sn
).
arg
(
cResponseTopic
);
// response.sn
qInfo
()
<<
"sendSubscriptionConfirmation"
<<
cResponseTopic
;
QJsonObject
json
;
json
[
"code"
]
=
response
.
code
;
json
[
"msg"
]
=
response
.
msg
;
json
[
"uniq"
]
=
response
.
uniq
;
QJsonDocument
jsonDoc
(
json
);
QByteArray
payload
=
jsonDoc
.
toJson
(
QJsonDocument
::
Compact
);
MQTTAsync_message
pubmsg
=
MQTTAsync_message_initializer
;
pubmsg
.
payload
=
const_cast
<
char
*>
(
payload
.
data
());
pubmsg
.
payloadlen
=
payload
.
size
();
pubmsg
.
qos
=
config
.
qos
;
pubmsg
.
retained
=
0
;
MQTTAsync_responseOptions
opts
=
MQTTAsync_responseOptions_initializer
;
opts
.
onSuccess
=
[](
void
*
context
,
MQTTAsync_successData
*
response
)
{
static_cast
<
MqttSubscriber
*>
(
context
)
->
onPublishSuccess
(
response
);
...
...
@@ -277,7 +240,7 @@ void MqttSubscriber::sendSubscriptionConfirmation(const vides_data::requestMqttD
static_cast
<
MqttSubscriber
*>
(
context
)
->
onPublishFailure
(
response
);
};
opts
.
context
=
this
;
int
rc
;
if
((
rc
=
MQTTAsync_sendMessage
(
client
,
cResponseTopic
,
&
pubmsg
,
&
opts
))
!=
MQTTASYNC_SUCCESS
)
{
qInfo
()
<<
"发送消息失败,返回编码"
<<
rc
;
...
...
MqttSubscriber.h
View file @
84806c68
...
...
@@ -45,7 +45,7 @@ private:
void
onPublishSuccess
(
MQTTAsync_successData
*
response
);
void
onPublishFailure
(
MQTTAsync_failureData
*
response
);
void
sendSubscriptionConfirmation
(
const
vides_data
::
requestMqttData
&
response
,
QString
&
sn
);
void
sendSubscriptionConfirmation
(
const
vides_data
::
requestMqttData
&
response
);
static
MqttSubscriber
*
instance
;
};
...
...
ParkingSpaceInfo.cpp
View file @
84806c68
...
...
@@ -10,6 +10,7 @@ ParkingSpaceInfo::ParkingSpaceInfo(){
}
ParkingSpaceInfo
::~
ParkingSpaceInfo
(){
qInfo
()
<<
"ParkingSpaceInfo:关闭"
;
}
void
ParkingSpaceInfo
::
addQueue
(
RecognizedInfo
&
info
){
QMutexLocker
locker
(
&
queueMutex
);
...
...
VidesData.h
View file @
84806c68
...
...
@@ -48,6 +48,8 @@ struct requestDeviceStatus
std
::
list
<
requestCameraInfo
>
camera_info_list
;
requestDeviceStatus
()
{}
};
struct
responseStsCredentials
{
QString
access_key_id
;
QString
access_key_secret
;
...
...
@@ -107,8 +109,6 @@ struct localDeviceStatus
QString
password
;
localDeviceStatus
()
{}
};
struct
requestFaceReconition
{
QString
id
;
...
...
@@ -250,6 +250,7 @@ struct Camera {
struct
FaceConfig
{
bool
isOn
;
int
faceNumbers
;
uint64
faceFrequency
;
float
confidence
;
int
faceLen
;
quint64
updateAt
;
...
...
@@ -260,7 +261,7 @@ struct LicensePlateConfig {
float
carConfidenceMax
;
float
carConfidenceMin
;
int
licensePlateLen
;
quint64
updateAt
;
quint64
updateAt
;
int
maxNum
;
///< 识别最大数量
bool
useHalf
;
///< 是否使用半精度推理模式
float
boxConfThreshold
;
///< 检测框阈值
...
...
@@ -280,7 +281,7 @@ struct UniformConfig {
};
struct
HumanConfig
{
bool
isOn
;
uint64
faceFrequency
;
int
humanDetectionLen
;
quint64
updateAt
;
};
...
...
@@ -312,12 +313,11 @@ struct responseMqttData{
uint8_t
msg_type
;
QString
sn
;
QString
uniq
;
QString
msg_body
;
};
struct
requestMqttData
{
QString
msg
;
int
code
;
QString
sn
;
int
code
;
QString
uniq
;
};
struct
DetectionParams
{
...
...
@@ -400,48 +400,16 @@ inline QString getDefaultGateway() {
return
gateway
;
}
inline
void
convertQStringToSXSDK_IPAddress
(
const
QString
&
ipString
,
SXSDK_IPAddress
&
hostIP
)
{
QHostAddress
address
(
ipString
);
quint32
ip
=
address
.
toIPv4Address
();
hostIP
.
c
[
0
]
=
(
ip
>>
24
)
&
0xFF
;
hostIP
.
c
[
1
]
=
(
ip
>>
16
)
&
0xFF
;
hostIP
.
c
[
2
]
=
(
ip
>>
8
)
&
0xFF
;
hostIP
.
c
[
3
]
=
ip
&
0xFF
;
}
// 获取本地 MAC 地址、子网掩码和网关IP
inline
bool
GetNetworkInfoByQNetworkInterface
(
QString
&
mac
,
QString
&
subnetMask
,
QString
&
gateway
)
{
QList
<
QNetworkInterface
>
interfaces
=
QNetworkInterface
::
allInterfaces
();
foreach
(
QNetworkInterface
interface
,
interfaces
)
{
if
(
interface
.
flags
().
testFlag
(
QNetworkInterface
::
IsUp
)
&&
interface
.
flags
().
testFlag
(
QNetworkInterface
::
IsRunning
)
&&
!
interface
.
flags
().
testFlag
(
QNetworkInterface
::
IsLoopBack
))
{
mac
=
interface
.
hardwareAddress
();
QList
<
QNetworkAddressEntry
>
addressEntries
=
interface
.
addressEntries
();
foreach
(
QNetworkAddressEntry
entry
,
addressEntries
)
{
if
(
entry
.
ip
().
protocol
()
==
QAbstractSocket
::
IPv4Protocol
)
{
subnetMask
=
entry
.
netmask
().
toString
();
gateway
=
entry
.
broadcast
().
toString
();
// 这里假设网关是广播地址
return
true
;
}
}
}
}
return
false
;
// Return false if no suitable interface is found
}
inline
bool
pingAddress
(
const
QString
&
address
)
{
QProcess
process
;
QString
program
=
"ping"
;
QStringList
arguments
;
#ifdef Q_OS_WIN
#ifdef Q_OS_WIN
arguments
<<
"-n"
<<
"1"
<<
address
;
#else
#else
arguments
<<
"-c"
<<
"1"
<<
address
;
#endif
#endif
process
.
start
(
program
,
arguments
);
if
(
!
process
.
waitForStarted
())
{
...
...
@@ -457,28 +425,11 @@ inline bool pingAddress(const QString &address) {
QString
output
(
process
.
readAllStandardOutput
());
// 简单的 Ping 成功检查逻辑
#ifdef Q_OS_WIN
#ifdef Q_OS_WIN
return
output
.
contains
(
"TTL="
);
#else
#else
return
output
.
contains
(
"1 packets transmitted, 1 received"
);
#endif
}
inline
QString
findReachableIp
()
{
QList
<
QHostAddress
>
ipAddressesList
=
QNetworkInterface
::
allAddresses
();
for
(
const
QHostAddress
&
address
:
ipAddressesList
)
{
if
(
address
.
protocol
()
==
QAbstractSocket
::
IPv4Protocol
&&
!
address
.
isLoopback
())
{
QString
ipAddress
=
address
.
toString
();
QString
currentSubnet
=
ipAddress
.
left
(
ipAddress
.
lastIndexOf
(
'.'
)
+
1
);
// 返回子网部分
for
(
int
i
=
254
;
i
>=
1
;
--
i
)
{
// 从 254 开始递减
QString
ip
=
currentSubnet
+
QString
::
number
(
i
);
if
(
!
pingAddress
(
ip
))
{
return
ip
;
}
}
}
}
return
QString
();
// 如果没有找到可用的 IP 地址,则返回空字符串
#endif
}
inline
int
GetCpuIdByAsm_arm
(
char
*
cpu_id
)
...
...
gamera_videos.pro
View file @
84806c68
...
...
@@ -13,8 +13,6 @@ TEMPLATE = app
# deprecated API in order to know how to port your code away from it.
DEFINES
+=
QT_DEPRECATED_WARNINGS
DEFINES
+=
APP_VERSION
=
\\\
"1.3.2\\\"
DEFINES
+=
QT_MESSAGELOGCONTEXT
DEFINES
+=
QT_NO_DEBUG_OUTPUT
QMAKE_LIBDIR
+=
/
usr
/
local
/
lib
...
...
@@ -26,9 +24,6 @@ INCLUDEPATH+=/usr/local/include/human
INCLUDEPATH
+=/
usr
/
local
/
include
/
CImg
INCLUDEPATH
+=/
usr
/
local
/
include
/
mqtt
# 禁用所有警告
QMAKE_CXXFLAGS
+=
-
w
...
...
mainwindow.cpp
View file @
84806c68
...
...
@@ -3,7 +3,7 @@
MainWindow
*
MainWindow
::
sp_this
=
nullptr
;
MainWindow
::
MainWindow
()
:
isResetting
(
false
)
MainWindow
::
MainWindow
()
{
sp_this
=
this
;
...
...
@@ -16,7 +16,7 @@ MainWindow::MainWindow():isResetting(false)
qSetting
->
setIniCodec
(
QTextCodec
::
codecForName
(
"UTF-8"
));
modelPaths
=
qSetting
->
value
(
"licensePlateRecognition/model_paths"
).
toString
();
QThreadPool
*
threadPool
=
QThreadPool
::
globalInstance
();
threadPool
->
setMaxThreadCount
(
12
);
...
...
@@ -47,7 +47,7 @@ MainWindow::MainWindow():isResetting(false)
configFetched
=
true
;
}
}
initCommon
();
deleteLogFileTimer
=
new
QTimer
(
this
);
...
...
@@ -65,11 +65,11 @@ MainWindow::MainWindow():isResetting(false)
int
licensePlateLen
=
config
.
licensePlateConfig
.
licensePlateLen
;
int
faceLen
=
config
.
faceConfig
.
faceLen
;
float
carShapeConfidence
=
config
.
uniformConfig
.
carShapeConfidence
;
bool
is_high
=
config
.
licensePlateConfig
.
isHigh
;
int
maxNum
=
config
.
licensePlateConfig
.
maxNum
;
bool
useHalf
=
config
.
licensePlateConfig
.
useHalf
;
float
boxThreshold
=
config
.
licensePlateConfig
.
boxConfThreshold
;
...
...
@@ -128,12 +128,11 @@ MainWindow::MainWindow():isResetting(false)
}
config
.
mqttConfig
.
clientId
=
serialNumber
;
QString
topic
=
QStringLiteral
(
"/thingshub/%1/device/reply"
).
arg
(
serialNumber
);
config
.
mqttConfig
.
topic
=
topic
;
this
->
mqttConfig
=
config
.
mqttConfig
;
runOrRebootMqtt
(
mqttConfig
,
httpurl
,
serialNumber
);
}
void
MainWindow
::
runOrRebootMqtt
(
vides_data
::
MqttConfig
&
mqtt_config
,
QString
&
httpUrl
,
QString
&
serialNumber
){
MqttSubscriber
*
subscriber
=
MqttSubscriber
::
getInstance
(
this
);
subscriber
->
init
(
mqtt_config
,
httpUrl
,
serialNumber
);
...
...
@@ -143,24 +142,24 @@ void MainWindow::runOrRebootMqtt(vides_data::MqttConfig &mqtt_config,QString &ht
void
MainWindow
::
divParameterUpdate
(
vides_data
::
responseConfig
&
cloudConfig
,
QString
&
httpUrl
,
QString
&
serialNumber
){
bool
faceAlgorithm
=
false
,
licensePlateAlgorithm
=
false
,
uniformAlgorithm
=
false
,
timeChange
=
false
;
AlgorithmTaskManage
&
algorithmTaskManage
=
AlgorithmTaskManage
::
getInstance
();
if
(
cloudConfig
.
faceConfig
.
updateAt
!=
config
.
faceConfig
.
updateAt
){
config
.
faceConfig
=
cloudConfig
.
faceConfig
;
faceAlgorithm
=
true
;
}
if
(
cloudConfig
.
licensePlateConfig
.
updateAt
!=
config
.
licensePlateConfig
.
updateAt
){
config
.
licensePlateConfig
=
cloudConfig
.
licensePlateConfig
;
licensePlateAlgorithm
=
true
;
}
if
(
cloudConfig
.
uniformConfig
.
updateAt
!=
config
.
uniformConfig
.
updateAt
){
config
.
uniformConfig
=
cloudConfig
.
uniformConfig
;
uniformAlgorithm
=
true
;
}
if
(
config
.
timerSettings
.
updateAt
!=
cloudConfig
.
timerSettings
.
updateAt
){
timeChange
=
true
;
}
...
...
@@ -172,9 +171,9 @@ void MainWindow::divParameterUpdate(vides_data::responseConfig &cloudConfig,QStr
runOrRebootMqtt
(
cloudConfig
.
mqttConfig
,
httpUrl
,
serialNumber
);
}
__uint8_t
alg
=
this
->
intToUint8t
(
faceAlgorithm
,
licensePlateAlgorithm
,
uniformAlgorithm
,
false
)
;
vides_data
::
DetectionParams
params
;
params
.
newHumanDetectionLen
=
cloudConfig
.
uniformConfig
.
humanDetectionLen
;
params
.
newLicensePlateLen
=
cloudConfig
.
licensePlateConfig
.
licensePlateLen
;
params
.
newFaceLen
=
cloudConfig
.
faceConfig
.
faceLen
;
...
...
@@ -191,8 +190,8 @@ void MainWindow::divParameterUpdate(vides_data::responseConfig &cloudConfig,QStr
params
.
boxConfThreshold
=
cloudConfig
.
licensePlateConfig
.
boxConfThreshold
;
params
.
nmsThreshold
=
cloudConfig
.
licensePlateConfig
.
nmsThreshold
;
params
.
recConfidenceThreshold
=
cloudConfig
.
licensePlateConfig
.
recConfidenceThreshold
;
algorithmTaskManage
.
releaseResources
(
params
);
if
(
config
.
timerSettings
.
updateAt
!=
cloudConfig
.
timerSettings
.
updateAt
){
if
(
config
.
timerSettings
.
deleteLogFileTimer
!=
cloudConfig
.
timerSettings
.
deleteLogFileTimer
){
...
...
@@ -209,34 +208,7 @@ void MainWindow::divParameterUpdate(vides_data::responseConfig &cloudConfig,QStr
}
}
void
MainWindow
::
modifySnMapIp
(
QString
&
sn
,
QString
&
ip
){
qSetting
->
beginGroup
(
"SnMapIp"
);
QStringList
lokeys
=
qSetting
->
childKeys
();
bool
keyExists
=
false
;
// 遍历现有键
foreach
(
QString
lk
,
lokeys
)
{
// 如果键存在,修改对应的值
if
(
lk
==
sn
)
{
qSetting
->
setValue
(
lk
,
ip
);
keyExists
=
true
;
break
;
}
}
// 如果键不存在,添加新键值对
if
(
!
keyExists
)
{
qSetting
->
setValue
(
sn
,
ip
);
}
qSetting
->
endGroup
();
}
void
MainWindow
::
findSnMapIp
(
QString
&
sn
,
QString
&
ip
){
// 直接通过键路径获取 IP 地址
ip
=
qSetting
->
value
(
QString
(
"SnMapIp/%1"
).
arg
(
sn
),
""
).
toString
();
}
CameraHandle
*
MainWindow
::
findHandle
(
QString
sn
){
for
(
auto
it
=
faceDetectionParkingPushs
.
begin
();
it
!=
faceDetectionParkingPushs
.
end
();
++
it
)
{
...
...
@@ -492,15 +464,9 @@ void MainWindow::clearHandle(QString sDevId, int nDevPort){
void
MainWindow
::
clearOfflineCameraHandle
(
QString
sDevId
,
int
nDevPort
)
{
emit
shutdownSignals
(
sDevId
,
nDevPort
);
}
void
MainWindow
::
setIsResetting
(
bool
running
)
{
this
->
isResetting
.
store
(
running
,
std
::
memory_order_release
);
}
//平台有 盒子没有 盒子开启
//平台没有 盒子有 盒子关闭
void
MainWindow
::
startCamera
(
const
QString
&
httpurl
){
if
(
this
->
isResetting
.
load
(
std
::
memory_order_acquire
)){
qInfo
()
<<
"正在执行复位GB28181 程序,请等待"
;
}
Common
&
instace
=
Common
::
getInstance
();
MediaFaceImage
*
mediaFaceImage
=
MediaFaceImage
::
getInstance
();
QString
nonConstHttpUrl
=
std
::
remove_const
<
QString
>::
type
(
httpurl
);
...
...
@@ -532,28 +498,30 @@ void MainWindow::startCamera(const QString &httpurl){
instace
.
deleteObj
(
res
);
return
;
}
vides_data
::
responseConfig
cloudConfig
;
HttpService
http_config
(
httpurl
);
vides_data
::
response
*
res_config
=
http
_config
.
httpDeviceConfig
(
serialNumber
,
cloudConfig
);
httpService
.
setHttpUrl
(
httpurl
);
vides_data
::
response
*
res_config
=
http
Service
.
httpDeviceConfig
(
serialNumber
,
cloudConfig
);
if
(
res_config
->
code
!=
0
){
qInfo
()
<<
"请求远程商户配置失败"
<<
res_config
->
msg
<<
res_config
->
code
;
qInfo
()
<<
"请求远程商户配置失败"
;
instace
.
deleteObj
(
res_config
);
return
;
}
instace
.
deleteObj
(
res_config
);
divParameterUpdate
(
cloudConfig
,
nonConstHttpUrl
,
serialNumber
);
for
(
const
auto
&
device
:
devices
.
list
)
{
if
(
localDevices
.
count
(
device
.
sSn
)
>
0
){
vides_data
::
localDeviceStatus
*
localDevice
=
localDevices
.
at
(
device
.
sSn
);
QString
ipAddress
=
QString
(
"%1.%2.%3.%4"
).
arg
(
localDevice
->
HostIP
.
c
[
0
]).
arg
(
localDevice
->
HostIP
.
c
[
1
]).
arg
(
localDevice
->
HostIP
.
c
[
2
]).
arg
(
localDevice
->
HostIP
.
c
[
3
]);
//this->gatewayRandomIp(ipAddress);
QString
key
=
ipAddress
+
":"
+
QString
::
number
(
localDevice
->
TCPPort
);
HttpService
http_device
(
httpurl
);
httpService
.
setHttpUrl
(
httpurl
);
vides_data
::
responseConfig
devConfig
;
vides_data
::
response
*
devRes
=
http
_de
vice
.
httpDeviceConfig
(
device
.
sSn
,
devConfig
);
vides_data
::
response
*
devRes
=
http
Ser
vice
.
httpDeviceConfig
(
device
.
sSn
,
devConfig
);
if
(
devRes
->
code
!=
0
){
qInfo
()
<<
"请求相机配置失败"
;
instace
.
deleteObj
(
devRes
);
...
...
@@ -587,25 +555,9 @@ void MainWindow::startCamera(const QString &httpurl){
offlineCameraHandle
->
findFirmwareVersion
(
camera_info
.
firmware_version
);
reStatus
.
camera_info_list
.
push_front
(
camera_info
);
HttpService
http_gb28181
(
httpurl
);
vides_data
::
response
*
res
=
http_gb28181
.
httpFindGb28181Config
(
camera_info
.
sSn
);
if
(
res
->
code
!=
0
){
qInfo
()
<<
"请求摄像头gb28181配置失败"
;
instace
.
deleteObj
(
res
);
return
;
}
vides_data
::
responseGb28181
*
gb281
=
reinterpret_cast
<
vides_data
::
responseGb28181
*>
(
res
->
data
);
offlineCameraHandle
->
updateSdkDevSpvMn
(
gb281
);
instace
.
deleteObj
(
gb281
);
instace
.
deleteObj
(
res
);
__uint8_t
new_algorithm
=
intToUint8t
(
devConfig
.
faceConfig
.
isOn
,
devConfig
.
licensePlateConfig
.
isOn
,
devConfig
.
uniformConfig
.
isOn
,
devConfig
.
humanConfig
.
isOn
);
uint64
face_frequency
=
devConfig
.
humanConfig
.
faceFrequency
;
offlineCameraHandle
->
initFaceFrequency
(
face_frequency
);
offlineCameraHandle
->
cameraParameterUpdate
(
devConfig
);
offlineCameraHandle
->
initAlgorithmPermissions
(
new_algorithm
);
if
(
!
offlineCameraHandle
->
compareLists
(
device
.
areas
)){
...
...
@@ -628,8 +580,9 @@ void MainWindow::startCamera(const QString &httpurl){
// 清空 localDevices 容器
localDevices
.
clear
();
}
HttpService
http_div
(
httpurl
);
vides_data
::
response
*
res
=
http_div
.
httpPostDeviceStatus
(
reStatus
);
httpService
.
setHttpUrl
(
httpurl
);
vides_data
::
response
*
res
=
httpService
.
httpPostDeviceStatus
(
reStatus
);
if
(
res
->
code
!=
0
){
qInfo
()
<<
"盒子状态上报失败 code:"
<<
res
->
code
<<
"msg:"
<<
res
->
msg
;
}
...
...
@@ -670,9 +623,9 @@ void MainWindow::initDevConfigSyn(CameraHandle *cameraHandle,vides_data::respons
QByteArray
bRecor
=
recor
.
toUtf8
();
const
char
*
cRecor
=
bRecor
.
data
();
cameraHandle
->
sdkRecordCfg
(
cRecor
);
QString
enCode_one
;
initDeviceEncodeToString
(
devConfig
,
enCode_one
);
QByteArray
benCode_one
=
enCode_one
.
toUtf8
();
const
char
*
b_one
=
benCode_one
.
data
();
...
...
@@ -771,6 +724,7 @@ void MainWindow::initEncodeToString(QString &enCodeJson) {
}
bool
MainWindow
::
iniWorkSpVMn
(
vides_data
::
responseGb28181
*
gb28181
,
QString
&
workSpWMn
,
QString
&
sn
){
qInfo
()
<<
"iniWorkSpVMn=="
<<
sn
;
QString
jsonfile
=
QCoreApplication
::
applicationDirPath
()
+
"/camera_config.json"
;
bool
isEqual
=
true
;
...
...
@@ -1011,7 +965,7 @@ __uint8_t MainWindow::intToUint8t(bool faceAlgorithm, bool licensePlateAlgorithm
__uint8_t
result
=
0
;
//人形识别对应最高高位(第3位)
result
|=
(
humanAlgorithm
?
1
:
0
)
<<
3
;
// 工服识别对应最高位(第2位)
result
|=
(
uniformAlgorithm
?
1
:
0
)
<<
2
;
...
...
@@ -1020,7 +974,9 @@ __uint8_t MainWindow::intToUint8t(bool faceAlgorithm, bool licensePlateAlgorithm
// 车牌识别对应最低位(第0位)
result
|=
(
licensePlateAlgorithm
?
1
:
0
);
qInfo
()
<<
"算法结果"
<<
result
;
return
result
;
}
void
MainWindow
::
initCameras
(
vides_data
::
cameraParameters
&
parameter
,
vides_data
::
responseConfig
&
devConfig
,
const
std
::
list
<
vides_data
::
responseArea
>&
areas
,
std
::
list
<
vides_data
::
requestCameraInfo
>&
camera_info_list
){
...
...
@@ -1032,26 +988,25 @@ void MainWindow::initCameras(vides_data::cameraParameters ¶meter,vides_data:
CameraHandle
*
cameraHandle
=
new
CameraHandle
(
parameter
.
sDevId
,
parameter
.
httpUrl
,
parameter
.
sSn
,
parameter
.
channel
,
image_save
,
heightReference
,
devConfig
);
int
sdk_handle
=
cameraHandle
->
sdkDevLoginSyn
(
parameter
.
sDevId
,
parameter
.
nDevPort
,
parameter
.
sUserName
,
parameter
.
sPassword
,
3000
);
qDebug
()
<<
QString
(
"SN(%1): 句柄为%2"
).
arg
(
parameter
.
sSn
).
arg
(
sdk_handle
);
qInfo
()
<<
"句柄为2:"
<<
sdk_handle
;
if
(
sdk_handle
<=
0
){
qInfo
()
<<
QString
(
"SN(%1): 登录失败"
).
arg
(
parameter
.
sSn
)
;
qInfo
()
<<
"登录失败"
;
return
;
}
mediaFaceImage
->
setMap
(
sdk_handle
,
cameraHandle
);
initDevConfigSyn
(
cameraHandle
,
devConfig
);
cameraHandle
->
sdkDevSetAlarmListener
(
sdk_handle
,
0
);
int
synTime
=
devConfig
.
camera
.
devSnapSynTimer
;
uint64
face_frequency
=
devConfig
.
human
Config
.
faceFrequency
;
uint64
face_frequency
=
devConfig
.
face
Config
.
faceFrequency
;
float
carConfidenceMax
=
devConfig
.
licensePlateConfig
.
carConfidenceMax
;
float
carConfidenceMin
=
devConfig
.
licensePlateConfig
.
carConfidenceMin
;
cameraHandle
->
initSdkRealTimeDevSnapSyn
(
synTime
,
face_frequency
);
cameraHandle
->
initSdkRealTimeDevSnapSyn
(
s
dk_handle
,
s
ynTime
,
face_frequency
);
cameraHandle
->
setCarConfidenceMaxAndMin
(
carConfidenceMax
,
carConfidenceMin
);
// QString pwd="admin2024";
...
...
@@ -1063,8 +1018,8 @@ void MainWindow::initCameras(vides_data::cameraParameters ¶meter,vides_data:
cameraHandle
->
findFirmwareVersion
(
camera_info
.
firmware_version
);
camera_info_list
.
push_front
(
camera_info
);
__uint8_t
new_algorithm
=
intToUint8t
(
devConfig
.
faceConfig
.
isOn
,
devConfig
.
licensePlateConfig
.
isOn
,
devConfig
.
uniformConfig
.
isOn
,
devConfig
.
humanConfig
.
isOn
);
__uint8_t
new_algorithm
=
(
devConfig
.
faceConfig
.
isOn
,
devConfig
.
licensePlateConfig
.
isOn
,
devConfig
.
uniformConfig
.
isOn
,
devConfig
.
humanConfig
.
isOn
);
cameraHandle
->
initAlgorithmPermissions
(
new_algorithm
);
cameraHandle
->
initParkingSpaceInfo
(
areas
);
...
...
mainwindow.h
View file @
84806c68
...
...
@@ -33,7 +33,7 @@ public:
explicit
MainWindow
();
void
initCommon
();
void
setVideoPath
(
int
flag
,
const
QString
&
path
);
void
createDirectory
(
int
flag
,
const
QString
&
dirName
,
const
QString
&
successMsg
,
const
QString
&
failureMsg
);
...
...
@@ -43,17 +43,15 @@ public:
void
initFaceFaceRecognition
();
void
initCameras
(
vides_data
::
cameraParameters
&
parameter
,
vides_data
::
responseConfig
&
devConfig
,
const
std
::
list
<
vides_data
::
responseArea
>&
areas
,
std
::
list
<
vides_data
::
requestCameraInfo
>&
camera_info_list
);
__uint8_t
intToUint8t
(
bool
faceAlgorithm
,
bool
licensePlateAlgorithm
,
bool
uniformAlgorithm
,
bool
humanAlgorithm
);
//盒子参数更新
void
divParameterUpdate
(
vides_data
::
responseConfig
&
cloudConfig
,
QString
&
httpUrl
,
QString
&
serialNumber
);
//盒子参数更新
void
divParameterUpdate
(
vides_data
::
responseConfig
&
cloudConfig
,
QString
&
httpUrl
,
QString
&
serialNumber
);
static
MainWindow
*
sp_this
;
CameraHandle
*
findHandle
(
QString
sn
);
void
modifySnMapIp
(
QString
&
sn
,
QString
&
ip
);
void
findSnMapIp
(
QString
&
sn
,
QString
&
ip
);
void
sendJsonResponse
(
QTcpSocket
*
socket
,
int
code
,
const
QString
&
data
,
const
QString
&
msg
);
void
sendEmptyResponse
(
QTcpSocket
*
socket
);
...
...
@@ -83,10 +81,8 @@ public:
// 过滤函数
void
deleteCloudNotCamer
(
const
std
::
map
<
QString
,
vides_data
::
localDeviceStatus
*>&
localDevices
,
const
std
::
list
<
vides_data
::
responseDeviceStatus
>&
devices
);
void
setIsResetting
(
bool
running
);
~
MainWindow
();
signals
:
void
shutdownSignals
(
QString
sDevId
,
int
nDevPort
);
...
...
@@ -105,7 +101,7 @@ private:
QSettings
*
qSetting
;
QTimer
*
deleteLogFileTimer
;
QTimer
*
dePermissionSynTimer
;
QTcpServer
server
;
...
...
@@ -122,10 +118,9 @@ private:
std
::
map
<
QString
,
CameraHandle
*>
faceDetectionParkingPushs
;
vides_data
::
responseConfig
config
;
vides_data
::
MqttConfig
mqttConfig
;
vides_data
::
MqttConfig
mqttConfig
;
std
::
atomic
<
bool
>
isResetting
;
};
#endif // MAINWINDOW_H
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment