计算速度优化,摄像头读取逻辑改变,分类器更新。

This commit is contained in:
xinyang
2019-07-28 15:59:01 +08:00
parent a5259cbd1f
commit 5a0fdb30af
24 changed files with 17667 additions and 115529 deletions

View File

@@ -6,6 +6,7 @@
#define _ADDITIONS_H_
#include <stdint.h>
#include <sys/time.h>
#include <serial/serial.h>
struct mcu_data{
@@ -30,5 +31,6 @@ void showOrigin(const cv::Mat &gimbal_src, const cv::Mat &chassis_src);
void showOrigin(const cv::Mat &gimbal_src);
void extract(cv::Mat &gimbal_src, cv::Mat &chassis_src);
void extract(cv::Mat &gimbal_src);
double getTimeIntervalms(const timeval& now, const timeval &last);
#endif /* _ADDITIONS_H_ */

View File

@@ -9,11 +9,12 @@
#include <stdio.h>
#include <iostream>
#include <thread>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/imgproc/imgproc.hpp>
#include "camera/wrapper_head.h"
#ifdef Windows
#include "camera/CameraApi.h"
#elif defined(Linux) || defined(Darwin)
@@ -21,10 +22,13 @@
#endif
class CameraWrapper: public WrapperHead {
friend void cameraCallback(CameraHandle hCamera, BYTE *pFrameBuffer, tSdkFrameHead* pFrameHead,PVOID pContext);
private:
const std::string name;
int mode;
bool init_done;
unsigned char* rgb_buffer;
int camera_cnts;
int camera_status;
@@ -38,6 +42,11 @@ private:
IplImage* iplImage;
int channel;
cv::Mat src_queue[2];
volatile int qhead;
volatile int qtail;
std::thread *readThread;
public:
int gain;
@@ -48,6 +57,8 @@ public:
bool read(cv::Mat& src) final;
bool readRaw(cv::Mat& src);
bool readProcessed(cv::Mat& src);
bool readCallback(cv::Mat& src);
bool readWithThread(cv::Mat &src);
bool changeBrightness(int brightness);
// bool once
};

View File

@@ -146,7 +146,7 @@
gettimeofday(&ts, NULL); \
codes; \
gettimeofday(&te, NULL); \
LOGM(tag": %.1lfms", (te.tv_sec-ts.tv_sec)*1000.0+(te.tv_usec-ts.tv_usec)/1000.0); \
LOGM(tag": %.1lfms", ##__VA_ARGS__, (te.tv_sec-ts.tv_sec)*1000.0+(te.tv_usec-ts.tv_usec)/1000.0); \
}while (0)
#else
#warning "Unsupport plantform for CNT_TIME"

View File

@@ -168,4 +168,8 @@ void extract(cv::Mat &gimbal_src) {//图像预处理将视频切成640×480
resize(gimbal_src, gimbal_src, cv::Size(640, width));
gimbal_src = gimbal_src(Rect(0, (width - 480) / 2, 640, 480));
}
}
}
double getTimeIntervalms(const timeval& now, const timeval &last){
return (now.tv_sec-last.tv_sec)*1000.0 + (now.tv_usec-last.tv_usec)/1000.0;
}

View File

@@ -4,6 +4,7 @@
#include <camera/camera_wrapper.h>
#include <log.h>
#include <additions/additions.h>
#include <options/options.h>
#include <config/setconfig.h>
@@ -15,15 +16,33 @@ using namespace cv;
CameraWrapper::CameraWrapper(int gain, int camera_mode, const std::string &n) :
name(n),
init_done(false),
mode(camera_mode),
camera_cnts(2),
camera_status(-1),
iplImage(nullptr),
rgb_buffer(nullptr),
channel(3),
gain(gain){
gain(gain),
qhead(0),
qtail(0),
readThread(nullptr){
}
void cameraCallback(CameraHandle hCamera, BYTE *pFrameBuffer, tSdkFrameHead* pFrameHead,PVOID pContext){
CameraWrapper *c = (CameraWrapper*)pContext;
CameraImageProcess(hCamera, pFrameBuffer, c->rgb_buffer, pFrameHead);
auto iplImage = cvCreateImageHeader(cvSize(pFrameHead->iWidth, pFrameHead->iHeight), IPL_DEPTH_8U, c->channel);
cvSetData(iplImage, c->rgb_buffer, pFrameHead->iWidth * c->channel); //此处只是设置指针,无图像块数据拷贝,不需担心转换效率
c->src_queue[c->qhead] = cv::cvarrToMat(iplImage).clone();
if((c->qhead+1)%2 == c->qtail){
c->qhead = (c->qhead+1)%2;
c->qtail = (c->qtail+1)%2;
} else {
c->qhead = (c->qhead+1)%2;
}
// LOGM("Get image, [%d %d]", c->qhead, c->qtail);
}
bool CameraWrapper::init() {
CameraSdkInit(1);
@@ -76,6 +95,8 @@ bool CameraWrapper::init() {
}
LOGM("successfully loaded %s!", filepath);
#elif defined(Linux)
CameraReadParameterFromFile(h_camera, PROJECT_DIR"/others/MV-UB31-Group0.config");
CameraLoadParameter(h_camera, PARAMETER_TEAM_A);
CameraSetAeState(h_camera, false);
CameraSetExposureTime(h_camera, CAMERA_EXPOSURE * 1000);
#ifndef WITH_TIME_BASED_CAMERA_GAIN
@@ -106,14 +127,13 @@ bool CameraWrapper::init() {
}
CameraSetAnalogGain(h_camera, gain);
#endif
if (mode == 0) {
CameraSetGain(h_camera, CAMERA_RED_GAIN, CAMERA_GREEN_GAIN, CAMERA_BLUE_GAIN);
CameraSetLutMode(h_camera, LUTMODE_PRESET);
}
#endif
double t;
int g;
CameraGetExposureTime(h_camera, &t);
LOGM("Exposure time: %lfms", t / 1000.0);
CameraGetAnalogGain(h_camera, &g);
LOGM("Exposure time: %lfms, gain:%d", t / 1000.0, g);
/*让SDK进入工作模式开始接收来自相机发送的图像
数据。如果当前相机是触发模式,则需要接收到
触发帧以后才会更新图像。 */
@@ -135,6 +155,10 @@ bool CameraWrapper::init() {
CameraSetIspOutFormat(h_camera, CAMERA_MEDIA_TYPE_BGR8);
LOGM("camera %s color ", camera_name);
}
if(mode == 2){
CameraSetCallbackFunction(h_camera, cameraCallback, this, nullptr);
}
init_done = true;
return true;
}
@@ -144,12 +168,18 @@ bool CameraWrapper::changeBrightness(int brightness) {
}
bool CameraWrapper::read(cv::Mat &src) {
if (mode == 0)return readProcessed(src);
if (mode == 1)return readRaw(src);
if(init_done) {
if (mode == 0)return readProcessed(src);
if (mode == 1)return readRaw(src);
if (mode == 2)return readCallback(src);
if (mode == 3)return readWithThread(src);
} else {
return false;
}
}
bool CameraWrapper::readRaw(cv::Mat &src) {
if (CameraGetImageBuffer(h_camera, &frame_info, &pby_buffer, 1000) == CAMERA_STATUS_SUCCESS) {
if (CameraGetImageBuffer(h_camera, &frame_info, &pby_buffer, 500) == CAMERA_STATUS_SUCCESS) {
if (iplImage) {
cvReleaseImageHeader(&iplImage);
}
@@ -173,7 +203,7 @@ bool CameraWrapper::readRaw(cv::Mat &src) {
bool CameraWrapper::readProcessed(cv::Mat &src) {
// cerr << "Get-1" << endl;
if (CameraGetImageBuffer(h_camera, &frame_info, &pby_buffer, 1000) == CAMERA_STATUS_SUCCESS) {
if (CameraGetImageBuffer(h_camera, &frame_info, &pby_buffer, 500) == CAMERA_STATUS_SUCCESS) {
CameraImageProcess(h_camera, pby_buffer, rgb_buffer,
&frame_info); // this function is super slow, better not to use it.
if (iplImage) {
@@ -192,9 +222,56 @@ bool CameraWrapper::readProcessed(cv::Mat &src) {
}
}
bool CameraWrapper::readCallback(cv::Mat &src) {
timeval ts, te;
gettimeofday(&ts, NULL);
while(qtail==qhead){
gettimeofday(&te, NULL);
if(getTimeIntervalms(te, ts) > 500){
return false;
}
}
src = src_queue[qtail];
// cout << src.size << endl;
qtail = (qtail+1)%2;
return true;
}
bool CameraWrapper::readWithThread(cv::Mat &src){
if(readThread != nullptr){
readThread->join();
src = src_queue[qtail];
qtail = (qtail+1)%2;
delete readThread;
readThread = new std::thread([&](){
readProcessed(src_queue[qhead]);
qhead = (qhead+1)%2;
});
}else{
readThread = new std::thread([&](){
readProcessed(src_queue[qhead]);
qhead = (qhead+1)%2;
});
readThread->join();
src = src_queue[qtail];
qtail = (qtail+1)%2;
delete readThread;
readThread = new std::thread([&](){
readProcessed(src_queue[qhead]);
qhead = (qhead+1)%2;
});
}
return true;
}
CameraWrapper::~CameraWrapper() {
CameraUnInit(h_camera);
//注意先反初始化后再free
if (rgb_buffer != nullptr)
free(rgb_buffer);
if(readThread != nullptr){
readThread->detach();
delete readThread;
}
}