备份备份
This commit is contained in:
@@ -236,95 +236,61 @@ void destory(Hd_CameraModule_HIK_soft * ptr)
|
||||
//经测试,相机像素格式Mono8、RGB8是可以正常转换的,YUV422还需要优化;RGB8格式比YUV422帧率低;BGR格式会导致异色问题
|
||||
void __stdcall ImageCallBackEx(unsigned char* pData0, MV_FRAME_OUT_INFO_EX* pFrameInfo0, void* pUser0)
|
||||
{
|
||||
n_mutex->lock();
|
||||
double time_Start = (double)clock();
|
||||
double timeStart = (double)clock();
|
||||
int frameNum = 0;
|
||||
cv::Mat srcImage = cv::Mat();
|
||||
cv::Mat srcImage;
|
||||
|
||||
if (pFrameInfo0)
|
||||
{
|
||||
//获取的是单通道灰度图
|
||||
if (pFrameInfo0->enPixelType == PixelType_Gvsp_Mono8)//获取当前采集到的图像格式
|
||||
if (pFrameInfo0->enPixelType == PixelType_Gvsp_Mono8)
|
||||
{
|
||||
srcImage = cv::Mat(pFrameInfo0->nHeight, pFrameInfo0->nWidth, CV_8UC1, pData0);
|
||||
}
|
||||
//获取的是RGB8图
|
||||
else if (pFrameInfo0->enPixelType == PixelType_Gvsp_BGR8_Packed)
|
||||
{
|
||||
srcImage = cv::Mat(pFrameInfo0->nHeight, pFrameInfo0->nWidth, CV_8UC3, pData0);
|
||||
}
|
||||
|
||||
////获取的是RGB8图
|
||||
//else if (pFrameInfo0->enPixelType == PixelType_Gvsp_RGB8_Packed)
|
||||
//{
|
||||
// cv::Mat dst = cv::Mat(pFrameInfo0->nHeight, pFrameInfo0->nWidth, CV_8UC3, pData0);
|
||||
// //cv::cvtColor(matimage, matimage, cv::COLOR_RGB2BGR);
|
||||
// srcImage = cv::Mat::zeros(pFrameInfo0->nHeight, pFrameInfo0->nWidth, CV_8UC3);
|
||||
// std::vector<cv::Mat> channels;
|
||||
// cv::split(dst, channels);//分割matimage的通道
|
||||
// std::vector<cv::Mat> dstchannels;
|
||||
// for (int i = 2; i >= 0; i--)
|
||||
// {
|
||||
// dstchannels.push_back(channels[i]);
|
||||
// }
|
||||
// merge(dstchannels, srcImage);
|
||||
//}
|
||||
|
||||
else if (IsColor(pFrameInfo0->enPixelType)) //其它格式彩色图
|
||||
else if (IsColor(pFrameInfo0->enPixelType))
|
||||
{
|
||||
MvGvspPixelType enDstPixelType = PixelType_Gvsp_Undefined;
|
||||
enDstPixelType = PixelType_Gvsp_BGR8_Packed;
|
||||
unsigned char* pConvertData = NULL;
|
||||
pConvertData = (unsigned char*)malloc(pFrameInfo0->nWidth * pFrameInfo0->nHeight * 3);
|
||||
if (NULL == pConvertData)
|
||||
{
|
||||
printf("malloc pConvertData fail!\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned int nConvertDataSize = 0;
|
||||
nConvertDataSize = pFrameInfo0->nWidth * pFrameInfo0->nHeight * 3;
|
||||
static std::vector<unsigned char> convertBuffer;
|
||||
size_t bufSize = pFrameInfo0->nWidth * pFrameInfo0->nHeight * 3;
|
||||
if (convertBuffer.size() < bufSize)
|
||||
convertBuffer.resize(bufSize);
|
||||
|
||||
// ch:像素格式转换 | en:Convert pixel format
|
||||
MV_CC_PIXEL_CONVERT_PARAM stConvertParam = { 0 };
|
||||
MV_CC_PIXEL_CONVERT_PARAM stConvertParam = { 0 };
|
||||
stConvertParam.nWidth = pFrameInfo0->nWidth;
|
||||
stConvertParam.nHeight = pFrameInfo0->nHeight;
|
||||
stConvertParam.pSrcData = pData0;
|
||||
stConvertParam.nSrcDataLen = pFrameInfo0->nFrameLen;
|
||||
stConvertParam.enSrcPixelType = pFrameInfo0->enPixelType;
|
||||
stConvertParam.enDstPixelType = PixelType_Gvsp_BGR8_Packed;
|
||||
stConvertParam.pDstBuffer = convertBuffer.data();
|
||||
stConvertParam.nDstBufferSize = bufSize;
|
||||
|
||||
frameNum = pFrameInfo0->nFrameNum; //ch:帧号 | en:frame number
|
||||
stConvertParam.nWidth = pFrameInfo0->nWidth; //ch:图像宽 | en:image width
|
||||
stConvertParam.nHeight = pFrameInfo0->nHeight; //ch:图像高 | en:image height
|
||||
stConvertParam.pSrcData = pData0; //ch:输入数据缓存 | en:input data buffer
|
||||
stConvertParam.nSrcDataLen = pFrameInfo0->nFrameLen; //ch:输入数据大小 | en:input data size
|
||||
stConvertParam.enSrcPixelType = pFrameInfo0->enPixelType; //ch:输入像素格式 | en:input pixel format
|
||||
stConvertParam.enDstPixelType = enDstPixelType; //ch:输出像素格式 | en:output pixel format
|
||||
stConvertParam.pDstBuffer = pConvertData; //ch:输出数据缓存 | en:output data buffer
|
||||
stConvertParam.nDstBufferSize = nConvertDataSize; //ch:输出缓存大小 | en:output buffer size
|
||||
int nRet = MV_CC_ConvertPixelType(handle, &stConvertParam);
|
||||
MV_CC_ConvertPixelType(handle, &stConvertParam);
|
||||
|
||||
Mat mysrcImage = cv::Mat(pFrameInfo0->nHeight, pFrameInfo0->nWidth, CV_8UC3, stConvertParam.pDstBuffer);
|
||||
mysrcImage.copyTo(srcImage);
|
||||
|
||||
free(pConvertData);
|
||||
pConvertData = NULL;
|
||||
stConvertParam = { 0 };
|
||||
}
|
||||
}
|
||||
srcImage = cv::Mat(pFrameInfo0->nHeight, pFrameInfo0->nWidth, CV_8UC3, stConvertParam.pDstBuffer).clone();
|
||||
}
|
||||
}
|
||||
if(srcImage.empty())
|
||||
|
||||
if (srcImage.empty())
|
||||
{
|
||||
srcImage = cv::Mat(5, 5, CV_8UC1).setTo(0);
|
||||
srcImage = cv::Mat(5, 5, CV_8UC1, cv::Scalar(0));
|
||||
}
|
||||
|
||||
m_flag = true;
|
||||
queuepic.push_back(srcImage.clone());
|
||||
n_mutex->unlock();
|
||||
pData0 = { 0 };
|
||||
double time_End = (double)clock();
|
||||
qDebug() << "[INFO] " << __FUNCTION__ << " line:" << __LINE__ << " checkImg getImg,Time:" << (time_End - time_Start) << "ms"
|
||||
<< "--CameraName:" << QString::fromStdString(Username) << " imgIndex:" << imgIndex << "nFrameNum : " << frameNum;
|
||||
/*QString savePath = "../runtime/Bin_DEVICE/testImg/camera_" + QString::number(imgIndex + 1)+".png";
|
||||
cv::Mat resizeS;
|
||||
cv::resize(srcImage, resizeS, cv::Size(), 0.1, 0.1);
|
||||
cv::imwrite(savePath.toStdString(), resizeS);*/
|
||||
{
|
||||
std::lock_guard<QMutex> locker(*n_mutex);
|
||||
queuepic.push_back(srcImage);
|
||||
m_flag = true;
|
||||
}
|
||||
|
||||
double timeEnd = (double)clock();
|
||||
qDebug() << "[INFO]" << __FUNCTION__ << "time:" << (timeEnd - timeStart) << "ms"
|
||||
<< "--CameraName:" << QString::fromStdString(Username)
|
||||
<< "imgIndex:" << imgIndex << "frameNum:" << frameNum;
|
||||
}
|
||||
|
||||
|
||||
void SetExposureTime(float exposureValue)
|
||||
{
|
||||
qDebug() << "[INFO] " << "exposureValue:" << exposureValue;
|
||||
@@ -373,26 +339,40 @@ Hd_CameraModule_HIK_soft::~Hd_CameraModule_HIK_soft()
|
||||
qDebug() << "[INFO] " << " delete success!";
|
||||
}
|
||||
//从类中读数据到实例对象
|
||||
bool Hd_CameraModule_HIK_soft::readData(std::vector<cv::Mat> &mat,QByteArray &data)
|
||||
bool Hd_CameraModule_HIK_soft::readData(std::vector<cv::Mat>& mat, QByteArray& data)
|
||||
{
|
||||
clock_t start = clock();
|
||||
/*cv::Mat img;
|
||||
{
|
||||
std::lock_guard<QMutex> locker(*n_mutex);
|
||||
if (queuepic.isEmpty())
|
||||
{
|
||||
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " srcImage is null";
|
||||
return false;
|
||||
}
|
||||
img = queuepic.dequeue();
|
||||
queuepic.clear();
|
||||
}*/
|
||||
std::lock_guard<QMutex> locker(*n_mutex);
|
||||
if (queuepic.isEmpty())
|
||||
{
|
||||
qCritical() << __FUNCTION__ << " line:" <<__LINE__ << " srcImage is null";
|
||||
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " srcImage is null";
|
||||
return false;
|
||||
}
|
||||
n_mutex->lock();
|
||||
cv::Mat img = cv::Mat();
|
||||
queuepic.dequeue().copyTo(img);
|
||||
mat.push_back(img.clone());
|
||||
n_mutex->unlock();
|
||||
QString qimgIndex = "imgIndex_" + QString::number(imgIndex-1)+"_中文测试";
|
||||
data = qimgIndex.toLocal8Bit();
|
||||
qDebug() << "[INFO] " << __FUNCTION__ << " line:" << __LINE__ << " checkImg readData--CameraName:" << QString::fromStdString(Username) << "--imgIndex : " << imgIndex-1;
|
||||
mat.push_back(queuepic.dequeue());
|
||||
//n_mutex->lock();
|
||||
//queuepic.clear();
|
||||
//n_mutex->unlock();
|
||||
clock_t stop = clock();
|
||||
//qDebug() << "[INFO]" << __FUNCTION__ << " line:" << __LINE__
|
||||
// << " checkImg readData -- CameraName:" << QString::fromStdString(Username)
|
||||
// << "--imgIndex:" << imgIndex - 1 << "timeCost->" << stop - start;
|
||||
return true;
|
||||
}
|
||||
//实例对象把数据写入到类
|
||||
bool Hd_CameraModule_HIK_soft::writeData(std::vector<cv::Mat> &mat,QByteArray &data)
|
||||
{
|
||||
#if 0
|
||||
//2024.02.18更新,相机对应的读SN信号时,表示新产品进入,设置初始值
|
||||
if (data == "rest_newProductIn")
|
||||
{
|
||||
@@ -409,7 +389,6 @@ bool Hd_CameraModule_HIK_soft::writeData(std::vector<cv::Mat> &mat,QByteArray &d
|
||||
n_mutex->lock();
|
||||
queuepic.clear();
|
||||
n_mutex->unlock();
|
||||
std::cout << "rest_newProductIn , queuePic.size() > 0 ,signal maybe too fast " << Username << std::endl;
|
||||
qWarning() << __FUNCTION__ << " line: " << __LINE__ << "rest_newProductIn , queuePic.size() > 0 ,signal maybe too fast " << QString::fromStdString(Username);
|
||||
}
|
||||
if (ifRunning == true)
|
||||
@@ -420,6 +399,10 @@ bool Hd_CameraModule_HIK_soft::writeData(std::vector<cv::Mat> &mat,QByteArray &d
|
||||
imgIndex = 0;
|
||||
return true;
|
||||
}
|
||||
else if (data == "softwareTrigger") {
|
||||
MV_CC_SetCommandValue(handle, "TriggerSoftware");
|
||||
qDebug() << "[INFO] " << "TriggerSoftware";
|
||||
}
|
||||
else
|
||||
{
|
||||
m_flag = false;
|
||||
@@ -474,8 +457,30 @@ bool Hd_CameraModule_HIK_soft::writeData(std::vector<cv::Mat> &mat,QByteArray &d
|
||||
data.append("SetGain_" + ui.doubleSpinBox->text() + "#");
|
||||
data.append("TriggerMode_" + ui.comboBox_triggerMode->currentText());*/
|
||||
|
||||
|
||||
qDebug() << "Hd_CameraModule_HIK_soft::writeData::" << data;
|
||||
#endif
|
||||
//if (data == "rest_newProductIn")
|
||||
//{
|
||||
// if (queuepic.size() > 0)
|
||||
// {
|
||||
// n_mutex->lock();
|
||||
// queuepic.clear();
|
||||
// n_mutex->unlock();
|
||||
// qWarning() << __FUNCTION__ << " line: " << __LINE__ << "rest_newProductIn , queuePic.size() > 0 ,signal maybe too fast " << QString::fromStdString(Username);
|
||||
// }
|
||||
// if (ifRunning == true)
|
||||
// {
|
||||
// ifBreak = true;
|
||||
// }
|
||||
// imgIndex = 0;
|
||||
// return true;
|
||||
//}
|
||||
//else
|
||||
if (data == "softwareTrigger") {
|
||||
MV_CC_SetCommandValue(handle, "TriggerSoftware");
|
||||
qDebug() << "[INFO] " << "TriggerSoftware";
|
||||
}
|
||||
else
|
||||
qDebug() << "Hd_CameraModule_HIK_soft::writeData::" << data;
|
||||
|
||||
m_flag = false;
|
||||
//Username = data.toStdString();
|
||||
@@ -622,7 +627,7 @@ bool Hd_CameraModule_HIK_soft::run()
|
||||
if (imgIndex == expourseTimeList.size())
|
||||
imgIndex = 0;
|
||||
//Sleep(100);
|
||||
qDebug() << "[INFO] " << " run start" <<QString::fromStdString(Username);
|
||||
//qDebug() << "[INFO] " << " run start" <<QString::fromStdString(Username);
|
||||
bool result = false;
|
||||
ifRunning = true;
|
||||
ifBreak = false;
|
||||
@@ -635,17 +640,17 @@ bool Hd_CameraModule_HIK_soft::run()
|
||||
//n_mutex->unlock();
|
||||
//m_thread->run(); //start()线程运行,频率高时有低概率无响应;
|
||||
|
||||
if (currentTriggerSource == MV_TRIGGER_SOURCE_SOFTWARE)
|
||||
/* if (currentTriggerSource == MV_TRIGGER_SOURCE_SOFTWARE)
|
||||
{
|
||||
MV_CC_SetCommandValue(handle, "TriggerSoftware");
|
||||
qDebug() << "[INFO] " << "TriggerSoftware";
|
||||
}
|
||||
else
|
||||
qDebug() << "[INFO] " << "TriggerHardware";
|
||||
qDebug() << "[INFO] " << "TriggerHardware";*/
|
||||
//MV_CC_SetCommandValue(handle, "TriggerSoftware");
|
||||
//Sleep(15);
|
||||
int mytime = 0;
|
||||
qDebug() << "[INFO] " << " waite Img" << QString::fromStdString(Username);
|
||||
//qDebug() << "[INFO] " << " waite Img" << QString::fromStdString(Username);
|
||||
while (true)
|
||||
{
|
||||
if (moduleStatus == false || mytime++ > getImageTimeOut || ifBreak == true )//|| m_flag==true)
|
||||
@@ -661,9 +666,9 @@ bool Hd_CameraModule_HIK_soft::run()
|
||||
break;
|
||||
}
|
||||
n_mutex->unlock();
|
||||
Sleep(1);
|
||||
QThread::msleep(10);
|
||||
}
|
||||
Sleep(1);
|
||||
//QThread::msleep(1);
|
||||
|
||||
//qDebug() << "[INFO] " << " expourseTimeList " << QString::fromStdString(Username);
|
||||
//软触发,不考虑误触发、漏触发
|
||||
@@ -696,7 +701,7 @@ bool Hd_CameraModule_HIK_soft::run()
|
||||
{
|
||||
qDebug() << "[Error] " << " ev:" << ev ;
|
||||
}
|
||||
qDebug() << "[INFO] " << __LINE__ << " run end" ;
|
||||
//qDebug() << "[INFO] " << __LINE__ << " run end" ;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user