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
0
Merge Requests
0
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
476b9ed9
Commit
476b9ed9
authored
May 13, 2024
by
“liusq”
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
增加析构同时添加关闭状态
parent
784d6dae
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
142 additions
and
110 deletions
+142
-110
CameraHandle.cpp
+11
-8
CameraHandle.h
+1
-0
FaceRecognition.h
+2
-0
FaceReconition.cpp
+16
-41
HttpService.cpp
+1
-0
HumanDetection.cpp
+3
-3
ScopeSemaphoreExit.cpp
+3
-3
VidesData.h
+53
-13
gamera_videos.pro
+41
-41
mainwindow.cpp
+11
-1
No files found.
CameraHandle.cpp
View file @
476b9ed9
...
...
@@ -39,8 +39,10 @@ CameraHandle::CameraHandle(QString &url, QString &httpUrl, QString &sSn, int &ch
}
CameraHandle
::~
CameraHandle
()
{
stopRequested_
=
true
;
Common
&
instace
=
Common
::
getInstance
();
dev_snap_syn_timer
->
stop
();
QThreadPool
::
globalInstance
()
->
waitForDone
();
instace
.
deleteObj
(
dev_snap_syn_timer
);
instace
.
deleteObj
(
loginParam
);
instace
.
deleteObj
(
sxMediaFaceImageReq
);
...
...
@@ -52,7 +54,7 @@ CameraHandle::~CameraHandle() {
instace
.
deleteObj
(
iter
->
second
);
}
parkMap
.
clear
();
QThreadPool
::
globalInstance
()
->
waitForDone
();
}
...
...
@@ -247,7 +249,6 @@ void CameraHandle::initSdkRealTimeDevSnapSyn(int hDevice,int syn_timer,uint64 fa
dev_snap_syn_timer
->
start
(
syn_timer
);
}
void
CameraHandle
::
sdkRealTimeDevSnapSyn
(
int
hDevice
)
{
QThreadPool
*
threadPool
=
QThreadPool
::
globalInstance
();
threadPool
->
setMaxThreadCount
(
8
);
auto
taskSyn
=
std
::
bind
(
&
CameraHandle
::
sdkDevSnapSyn
,
this
,
hDevice
,
this
->
channel
);
...
...
@@ -325,6 +326,7 @@ void CameraHandle::sdkDownloadFileByTime(XSDK_HANDLE hDevice,int id,
}
int
CameraHandle
::
callbackFunction
(
XSDK_HANDLE
hObject
,
QString
&
szString
)
{
if
(
stopRequested_
)
return
-
1
;
if
(
!
semaphore
.
tryAcquire
())
{
qInfo
()
<<
"sdkDevSnapSyn:正在执行线程"
;
return
-
1
;
...
...
@@ -368,6 +370,7 @@ int CameraHandle::callbackFunction(XSDK_HANDLE hObject, QString &szString) {
}
void
CameraHandle
::
sdkDevSnapSyn
(
XSDK_HANDLE
hDevice
,
int
nChannel
){
if
(
stopRequested_
)
return
;
if
(
hDevice
<=
0
){
qInfo
()
<<
"相机断线"
;
return
;
...
...
@@ -440,7 +443,7 @@ void CameraHandle::checkAndUpdateCurrentPlate(ParkingSpaceInfo*park,const cv::Ma
//当前为空,立场
if
(
newInfo
.
getLicensePlate
().
length
()
<=
0
){
HumanDetection
&
humanDetection
=
HumanDetection
::
getInstance
();
int
car_size
=
humanDetection
.
findHuManCar
(
frame
,
1
,
detector
);
int
car_size
=
humanDetection
.
findHuManCar
(
frame
,
0x0
1
,
detector
);
qDebug
()
<<
sSn
<<
":"
<<
"当前车形数量:"
<<
car_size
;
if
(
car_size
<=
0
){
//出场
...
...
@@ -491,18 +494,18 @@ void CameraHandle::updateImage(const cv::Mat & frame,qint64 currentTime){
QByteArray
imgs
;
this
->
matToBase64
(
frame
,
imgs
);
HttpService
httpService
(
httpUrl
);
int
faSize
=
-
1
;
int
faSize
=
0
;
if
((
algorithmPermissions
&
0x01
<<
1
)
!=
0
)
{
faSize
=
humanDetection
.
findHuManCar
(
frame
,
0
,
detector
);
faSize
=
humanDetection
.
findHuManCar
(
frame
,
0
x00
,
detector
);
if
(
currentFace
!=
faSize
){
if
(
currentFace
!=
faSize
){
if
(
faceCount
.
load
(
std
::
memory_order_relaxed
)
%
face_frequency
==
0
){
vides_data
::
response
*
resp
=
httpService
.
httpPostFacePopulation
(
imgs
,
faSize
,
sSn
,
currentTime
);
if
(
resp
->
code
!=
0
)
{
qInfo
()
<<
"人数变化推送信息推送失败"
;
}
instace
.
deleteObj
(
resp
);
currentFace
=
faSize
;
currentFace
=
faSize
;
}
}
}
...
...
@@ -511,7 +514,7 @@ void CameraHandle::updateImage(const cv::Mat & frame,qint64 currentTime){
if
(
uniforms
>
0
){
if
(
faceCount
.
load
(
std
::
memory_order_relaxed
)
%
face_frequency
==
0
){
httpService
.
setHttpUrl
(
httpUrl
);
vides_data
::
response
*
resp
=
httpService
.
httpPostUniforms
(
imgs
,
faSize
,
sSn
,
currentTime
);
vides_data
::
response
*
resp
=
httpService
.
httpPostUniforms
(
imgs
,
uniforms
,
sSn
,
currentTime
);
if
(
resp
->
code
!=
0
)
{
qInfo
()
<<
"推送未穿工服人数失败"
;
}
...
...
CameraHandle.h
View file @
476b9ed9
...
...
@@ -126,6 +126,7 @@ private :
int
hDevice
;
int
channel
;
QString
httpUrl
;
bool
stopRequested_
=
false
;
SXSDKLoginParam
*
loginParam
;
SXMediaFaceImageReq
*
sxMediaFaceImageReq
;
...
...
FaceRecognition.h
View file @
476b9ed9
...
...
@@ -33,6 +33,8 @@ public:
cv
::
Mat
loadImage
(
const
QString
&
path
);
cv
::
Mat
loadImageFromByteStream
(
const
QString
&
filePath
);
void
doesItExistEmployee
(
const
cv
::
Mat
&
source
,
std
::
list
<
vides_data
::
faceRecognitionResult
>&
face
);
void
initSourceImageMap
(
std
::
map
<
QString
,
QString
>&
maps
,
int
numberFaces
,
float
confidence
);
...
...
FaceReconition.cpp
View file @
476b9ed9
...
...
@@ -2,6 +2,9 @@
#include <QImage>
#include <QThread>
#include <iostream>
#define cimg_display 0
#include "CImg.h"
...
...
@@ -20,31 +23,6 @@ FaceReconition::~FaceReconition(){
FaceReconition
*
FaceReconition
::
instance
=
nullptr
;
//cv::Mat FaceReconition::loadImage(const QString &path) {
// // 尝试使用OpenCV直接加载图像
// std::string stdPath = path.toStdString(); // 将路径转换为std::string
// cv::Mat image = cv::imread(stdPath, cv::IMREAD_COLOR); // 尝试加载图像
// if (!image.empty()) {
// qDebug() << "图像以OpenCV成功加载。";
// return image;
// }
// // 使用OpenCV加载失败,尝试使用QImage
// qDebug() << "使用OpenCV加载图像失败,尝试QImage转换。";
// QImage qimg(path);
// if (qimg.isNull()) {
// qDebug() << "QImage也无法加载图像,检查文件路径或文件损坏。";
// return cv::Mat(); // 返回空的cv::Mat对象
// }
// // 转换QImage格式为RGB888
// QImage converted = qimg.convertToFormat(QImage::Format_RGB888);
// cv::Mat mat(converted.height(), converted.width(), CV_8UC3, const_cast<uchar*>(converted.bits()), static_cast<size_t>(converted.bytesPerLine()));
// // 不进行颜色转换,直接返回
// return mat;
//}
cv
::
Mat
FaceReconition
::
loadImage
(
const
QString
&
path
)
{
// 尝试使用OpenCV直接加载图像
std
::
string
stdPath
=
path
.
toStdString
();
...
...
@@ -165,9 +143,11 @@ int FaceReconition::featureRemove(){
}
}
}
cv
::
Mat
FaceReconition
::
loadImageFromByteStream
(
const
QString
&
filePath
)
{
try
{
try
{
// 使用 CImg 读取 JPEG 图像
QByteArray
bPath
=
filePath
.
toUtf8
();
const
char
*
ctr
=
bPath
.
data
();
...
...
@@ -176,24 +156,16 @@ cv::Mat FaceReconition::loadImageFromByteStream(const QString& filePath) {
// 将 CImg 对象转换为 OpenCV 的 Mat 格式
int
width
=
cimg_image
.
width
();
int
height
=
cimg_image
.
height
();
int
channels
=
cimg_image
.
spectrum
();
// 图像通道数
cv
::
Mat
mat
(
height
,
width
,
CV_8UC3
);
// 创建一个对应的空 Mat 对象
cv
::
Mat
opencv_image
(
height
,
width
,
channels
==
1
?
CV_8UC1
:
CV_8UC3
);
// 复制图像数据到 Mat 对象
cimg_forXY
(
cimg_image
,
x
,
y
)
{
if
(
channels
==
1
)
{
opencv_image
.
at
<
unsigned
char
>
(
y
,
x
)
=
cimg_image
(
x
,
y
,
0
,
0
);
}
else
{
// 注意 OpenCV 默认使用 BGR 而不是 RGB
cv
::
Vec3b
&
opencv_pixel
=
opencv_image
.
at
<
cv
::
Vec3b
>
(
y
,
x
);
opencv_pixel
[
2
]
=
cimg_image
(
x
,
y
,
0
,
0
);
// Red
opencv_pixel
[
1
]
=
cimg_image
(
x
,
y
,
0
,
1
);
// Green
opencv_pixel
[
0
]
=
cimg_image
(
x
,
y
,
0
,
2
);
// Blue
}
// 注意OpenCV默认是BGR顺序
// CImg中像素的存取方式是 (x, y, z, c) 其中c是颜色通道
mat
.
at
<
cv
::
Vec3b
>
(
y
,
x
)[
2
]
=
cimg_image
(
x
,
y
,
0
,
0
);
// R
mat
.
at
<
cv
::
Vec3b
>
(
y
,
x
)[
1
]
=
cimg_image
(
x
,
y
,
0
,
1
);
// G
mat
.
at
<
cv
::
Vec3b
>
(
y
,
x
)[
0
]
=
cimg_image
(
x
,
y
,
0
,
2
);
// B
}
return
opencv_image
;
return
mat
;
}
catch
(
const
CImgException
&
e
)
{
qDebug
()
<<
"CImg Error: "
<<
e
.
what
();
return
cv
::
Mat
();;
...
...
@@ -201,9 +173,12 @@ cv::Mat FaceReconition::loadImageFromByteStream(const QString& filePath) {
qDebug
()
<<
"OpenCV Error: "
<<
e
.
what
();
return
cv
::
Mat
();
;
}
return
cv
::
Mat
();
}
void
FaceReconition
::
doesItExistEmployee
(
const
cv
::
Mat
&
source
,
std
::
list
<
vides_data
::
faceRecognitionResult
>&
faces
){
//QReadLocker locker(&rwLock);
HResult
ret
;
...
...
HttpService.cpp
View file @
476b9ed9
...
...
@@ -3,6 +3,7 @@
vides_data
::
responseStsCredentials
HttpService
::
stsCredentials
;
HttpService
::
HttpService
()
{
}
HttpService
::
HttpService
(
QString
httpUrl
)
{
this
->
httpUrl
=
httpUrl
;
...
...
HumanDetection.cpp
View file @
476b9ed9
...
...
@@ -15,7 +15,7 @@ int HumanDetection::findHuManCar(const cv::Mat &source,int res,TCV_HumanDetector
// 执行一帧目标检测
TCV_HumanDetectorProcessFrame
(
detector
,
stream
);
int
num
=
-
1
;
int
num
=
0
;
if
(
res
==
0x00
||
res
==
0x02
){
num
=
TCV_HumanDetectorGetNumOfHuman
(
detector
);
if
(
num
>
0
&&
res
==
0x02
)
{
...
...
@@ -32,11 +32,11 @@ int HumanDetection::findHuManCar(const cv::Mat &source,int res,TCV_HumanDetector
}
num
=
num_uniforms
;
}
qDebug
()
<<
(
res
==
0
?
"
Number of people detected:"
:
"Number of people with uniform == 0 detected
:"
)
<<
num
;
qDebug
()
<<
(
res
==
0
?
"
findHuManCar 检测到的人数:"
:
"findHuManCar 未穿工服的人数
:"
)
<<
num
;
}
else
if
(
res
==
0x01
)
{
num
=
TCV_HumanDetectorGetNumOfCar
(
detector
);
qDebug
()
<<
"
Number of cars detected
:"
<<
num
;
qDebug
()
<<
"
findHuManCar 检测到的汽车数量
:"
<<
num
;
}
else
{
qDebug
()
<<
"参数错误"
;
...
...
ScopeSemaphoreExit.cpp
View file @
476b9ed9
#include "ScopeSemaphoreExit.h"
ScopeSemaphoreExit
::
ScopeSemaphoreExit
(
std
::
function
<
void
()
>
onExit
)
ScopeSemaphoreExit
::
ScopeSemaphoreExit
(
std
::
function
<
void
()
>
onExit
)
:
onExit_
(
onExit
)
{}
ScopeSemaphoreExit
::~
ScopeSemaphoreExit
()
{
ScopeSemaphoreExit
::~
ScopeSemaphoreExit
()
{
if
(
onExit_
)
onExit_
();
}
}
VidesData.h
View file @
476b9ed9
...
...
@@ -272,23 +272,63 @@ inline bool pingAddress(const QString &address) {
return
output
.
contains
(
"1 packets transmitted, 1 received"
);
}
inline
int
GetCpuIdByAsm_arm
(
char
*
cpu_id
)
{
FILE
*
fp
=
fopen
(
"/proc/cpuinfo"
,
"r"
);
if
(
nullptr
==
fp
)
{
qDebug
()
<<
"failed to open cpuinfo"
;
return
-
1
;
}
inline
QString
getCpuSerialNumber
()
{
QProcess
process
;
// 启动一个进程运行shell命令
process
.
start
(
"sh"
,
QStringList
()
<<
"-c"
<<
"cat /proc/cpuinfo | grep Serial"
);
// 等待命令执行完成
process
.
waitForFinished
();
// 读取命令的标准输出
QString
output
=
process
.
readAllStandardOutput
();
char
cpuSerial
[
100
]
=
{
0
};
QString
serialNumber
;
if
(
!
output
.
isEmpty
())
{
// 已经确保了输出仅包含 Serial 行,所以直接分割并提取
serialNumber
=
output
.
split
(
":"
).
last
().
trimmed
();
while
(
!
feof
(
fp
))
{
memset
(
cpuSerial
,
0
,
sizeof
(
cpuSerial
));
fgets
(
cpuSerial
,
sizeof
(
cpuSerial
)
-
1
,
fp
);
// leave out \n
char
*
pch
=
strstr
(
cpuSerial
,
"Serial"
);
if
(
pch
)
{
char
*
pch2
=
strchr
(
cpuSerial
,
':'
);
if
(
pch2
)
{
memmove
(
cpu_id
,
pch2
+
2
,
strlen
(
cpuSerial
));
break
;
}
else
{
fclose
(
fp
);
return
-
1
;
}
}
}
fclose
(
fp
);
return
serialNumber
;
return
0
;
}
inline
QString
getCpuSerialNumber
()
{
QFile
file
(
"/proc/cpuinfo"
);
if
(
!
file
.
open
(
QIODevice
::
ReadOnly
|
QIODevice
::
Text
))
{
qDebug
()
<<
"无法打开 /proc/cpuinfo 文件"
;
return
QString
();
}
QTextStream
in
(
&
file
);
QString
line
;
while
(
!
in
.
atEnd
())
{
line
=
in
.
readLine
();
if
(
line
.
startsWith
(
"Serial"
))
{
QStringList
parts
=
line
.
split
(
":"
);
if
(
parts
.
size
()
>
1
)
{
QString
serial
=
parts
.
at
(
1
).
trimmed
();
return
serial
;
}
}
}
return
QString
();
}
}
...
...
gamera_videos.pro
View file @
476b9ed9
...
...
@@ -11,46 +11,46 @@ TEMPLATE = app
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES
+=
QT_DEPRECATED_WARNINGS
DEFINES
+=
APP_VERSION
=
\\\
"1.0.
0
\\\"
#
QMAKE_LIBDIR += /usr/local/lib
#
INCLUDEPATH+=/usr/local/include/opencv4
#
INCLUDEPATH+=/usr/local/include/hyperface
#
INCLUDEPATH+=/usr/local/include/hyper
#
INCLUDEPATH+=/usr/local/include/XNetSDK
#
INCLUDEPATH+=/usr/local/include/human
#
INCLUDEPATH+=/usr/local/include/CImg
unix
:
contains
(
QMAKE_HOST
.
arch
,
x86_64
)
{
QMAKE_LIBDIR
+=
/
home
/
mark
/
Public
/
x86_opencv
/
lib
}
unix
:
contains
(
QMAKE_HOST
.
arch
,
arm
)
{
QMAKE_LIBDIR
+=
/
usr
/
local
/
lib
}
# 根据编译器类型选择库路径和头文件路径
unix
:
{
#
x86
架构
contains
(
QMAKE_HOST
.
arch
,
x86_64
)
{
INCLUDEPATH
+=/
home
/
mark
/
Public
/
x86_opencv
/
include
/
opencv4
INCLUDEPATH
+=/
home
/
mark
/
Public
/
x86_opencv
/
include
/
hyperface
INCLUDEPATH
+=/
home
/
mark
/
Public
/
x86_opencv
/
include
/
hyper
INCLUDEPATH
+=/
home
/
mark
/
Public
/
x86_opencv
/
include
/
XNetSDK
INCLUDEPATH
+=/
home
/
mark
/
Public
/
x86_opencv
/
include
/
human
INCLUDEPATH
+=/
home
/
mark
/
Public
/
x86_opencv
/
include
/
CImg
}
#
ARM
架构
contains
(
QMAKE_HOST
.
arch
,
arm
)
{
INCLUDEPATH
+=/
usr
/
local
/
include
/
opencv4
INCLUDEPATH
+=/
usr
/
local
/
include
/
hyperface
INCLUDEPATH
+=/
usr
/
local
/
include
/
hyper
INCLUDEPATH
+=/
usr
/
local
/
include
/
XNetSDK
INCLUDEPATH
+=/
usr
/
local
/
include
/
human
}
}
DEFINES
+=
APP_VERSION
=
\\\
"1.0.
1
\\\"
QMAKE_LIBDIR
+=
/
usr
/
local
/
lib
INCLUDEPATH
+=/
usr
/
local
/
include
/
opencv4
INCLUDEPATH
+=/
usr
/
local
/
include
/
hyperface
INCLUDEPATH
+=/
usr
/
local
/
include
/
hyper
INCLUDEPATH
+=/
usr
/
local
/
include
/
XNetSDK
INCLUDEPATH
+=/
usr
/
local
/
include
/
human
INCLUDEPATH
+=/
usr
/
local
/
include
/
CImg
#
unix:contains(QMAKE_HOST.arch, x86_64) {
#
QMAKE_LIBDIR += /home/mark/Public/x86_opencv/lib
#
}
#
unix:contains(QMAKE_HOST.arch, arm) {
#
QMAKE_LIBDIR += /usr/local/lib
#
}
#
#
根据编译器类型选择库路径和头文件路径
#
unix: {
#
# x86 架构
#
contains(QMAKE_HOST.arch, x86_64) {
#
INCLUDEPATH+=/home/mark/Public/x86_opencv/include/opencv4
#
INCLUDEPATH+=/home/mark/Public/x86_opencv/include/hyperface
#
INCLUDEPATH+=/home/mark/Public/x86_opencv/include/hyper
#
INCLUDEPATH+=/home/mark/Public/x86_opencv/include/XNetSDK
#
INCLUDEPATH+=/home/mark/Public/x86_opencv/include/human
#
INCLUDEPATH+=/home/mark/Public/x86_opencv/include/CImg
#
}
#
# ARM 架构
#
contains(QMAKE_HOST.arch, arm) {
#
INCLUDEPATH+=/usr/local/include/opencv4
#
INCLUDEPATH+=/usr/local/include/hyperface
#
INCLUDEPATH+=/usr/local/include/hyper
#
INCLUDEPATH+=/usr/local/include/XNetSDK
#
INCLUDEPATH+=/usr/local/include/human
#
}
#
}
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
...
...
@@ -76,7 +76,7 @@ LIBS += -lopencv_core \
-
lopencv_objdetect
\
-
lsohuman
\
# -lssl \
# -lcrypto \
# -lcrypto \
sudo apt-get install libjpeg-dev libpng-dev
-
lc
\
-
lXNetSDK
#-
lz
...
...
mainwindow.cpp
View file @
476b9ed9
...
...
@@ -284,7 +284,17 @@ void MainWindow::findLocalSerialNumber(QString &serialNumber){
if
(
localSn
.
length
()
>
0
){
serialNumber
=
localSn
;
}
else
{
serialNumber
=
vides_data
::
getCpuSerialNumber
();
QString
number
=
vides_data
::
getCpuSerialNumber
();
if
(
number
.
length
()
<=
0
){
char
cpu_id_arm
[
40
]
=
{
0
};
int
result
=
vides_data
::
GetCpuIdByAsm_arm
(
cpu_id_arm
);
//EC-06-08-00-FF-FB-8B-1F
if
(
result
>=
0
)
{
number
=
cpu_id_arm
;
}
}
serialNumber
=
number
.
trimmed
();
localSn
=
serialNumber
;
}
}
...
...
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