还剩信号连接

This commit is contained in:
2024-05-20 18:13:21 +08:00
parent b214669be7
commit ed55e511ec
32 changed files with 237 additions and 469 deletions
@@ -1,70 +0,0 @@
# 获取获取当前目录名
get_filename_component(CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(TIMESTAMP RUN_TIME)
message( " model start : " ${CURRENT_FOLDER}:${RUN_TIME})
set(DLL_NAMES "mvs" "opencv")
foreach(child ${DLL_NAMES})
LIST(APPEND ENV_INCLUDE ${${child}_include})
LIST(APPEND ENV_LIB ${${child}_lib})
LIST(APPEND ENV_TARGET ${${child}_target_link})
endforeach()
message(" ENV_INCLUDE : " ${ENV_INCLUDE} )
message(" ENV_LIB : " ${ENV_LIB} )
message(" ENV_TARGET : " ${ENV_TARGET} )
include_directories(
${ENV_INCLUDE}
)
link_directories (
${ENV_LIB}
)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
SET(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
SET(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
FILE(GLOB HEAD_FILES "./*.h" )
FILE(GLOB SRC_FILES "./*.cpp")
FILE(GLOB UI_FILES "./*.ui")
#find_package(Qt5 COMPONENTS Core REQUIRED)
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED)
add_library(${CURRENT_FOLDER} SHARED
${HEAD_FILES}
${SRC_FILES}
${UI_FILES}
)
set_target_properties(${CURRENT_FOLDER} PROPERTIES LINKER_LANGUAGE C
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}
)
target_link_libraries(${CURRENT_FOLDER} PRIVATE
${ENV_TARGET}
Qt${QT_VERSION_MAJOR}::Core
)
# target_compile_definitions(${CURRENT_FOLDER} PRIVATE HD_AIDEMO_MODULE_LIBRARY)
string(TIMESTAMP RUN_TIME)
message( " model end : " ${CURRENT_FOLDER}:${RUN_TIME})
@@ -1,259 +0,0 @@
#include "Hd_MvCameraTL_module.h"
#include <QDebug>
QQueue<cv::Mat> queuePic;
QMutex* n_mutex = new QMutex();
//0106 断连提示
void _stdcall ExceptionCB(unsigned int nMesgType, void* pUser) {
mv_Status = "disconnect";
qDebug() << "[Error] " << " MvCameraTL disconnects!";
}
Hd_MvCameraTL_module* create()
{
qDebug() << "[INFO] " << "Hd_MvCamera_module create success!" ;
return new Hd_MvCameraTL_module;
}
void destory(Hd_MvCameraTL_module * ptr)
{
if(ptr)
{
delete ptr;
ptr = nullptr;
}
qDebug() << "[INFO] " << "Hd_MvCamera_module destory success!";
}
void __stdcall ImageCallBackEx(unsigned char* pData0, MV_FRAME_OUT_INFO_EX* pFrameInfo0, void* pUser0)
{
Q_UNUSED(pUser0)
double time_Start = (double)clock();
cv::Mat srcImage;
//qDebug() << "[info]" << __FUNCTION__ << " line:" << __LINE__ << "--- start";
if (pFrameInfo0)
{
//获取的是单通道灰度图
if (pFrameInfo0->enPixelType == PixelType_Gvsp_Mono8)//获取当前采集到的图像格式
{
srcImage = cv::Mat(pFrameInfo0->nHeight, pFrameInfo0->nWidth, CV_8UC1, pData0);
}
//获取的是RGB8图
else if (pFrameInfo0->enPixelType == PixelType_Gvsp_RGB8_Packed)
{
srcImage = cv::Mat(pFrameInfo0->nHeight, pFrameInfo0->nWidth, CV_8UC3,pData0);
cvtColor(srcImage, srcImage, COLOR_RGB2BGR);
}
else if (pFrameInfo0->enPixelType == PixelType_Gvsp_BGR8_Packed)
{
srcImage = cv::Mat(pFrameInfo0->nHeight, pFrameInfo0->nWidth, CV_8UC3, pData0);
//cvtColor(srcImage, srcImage, COLOR_RGB2BGR);//导致异色
}
//获取的是yuv或bayer图
else if (pFrameInfo0->enPixelType == PixelType_Gvsp_YUV422_Packed || pFrameInfo0->enPixelType == PixelType_Gvsp_BayerRG8)
{
MvGvspPixelType enDstPixelType = PixelType_Gvsp_Undefined;
enDstPixelType = PixelType_Gvsp_BGR8_Packed;
unsigned int nConvertDataSize = pFrameInfo0->nWidth * pFrameInfo0->nHeight * 3;
unsigned char* pConvertData = (unsigned char*)malloc(nConvertDataSize);
if (NULL == pConvertData)
{
printf("malloc pConvertData1 fail!\n");
m_flag = true;
srcImage = cv::Mat(5, 5, CV_8UC1).setTo(0);
n_mutex->lock();
queuePic.append(srcImage);
n_mutex->unlock();
return;
}
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 = enDstPixelType;
stConvertParam.pDstBuffer = pConvertData;
stConvertParam.nDstBufferSize = nConvertDataSize;
int nRet = MV_CC_ConvertPixelType(handle, &stConvertParam);
if (MV_OK == nRet)
{
srcImage = cv::Mat::zeros(cv::Size(pFrameInfo0->nWidth, pFrameInfo0->nHeight), CV_8UC3);
memcpy(srcImage.data, stConvertParam.pDstBuffer, nConvertDataSize);
//Mat mysrcImage = cv::Mat(mypFrameInfo->nHeight, mypFrameInfo->nWidth, CV_8UC3, stConvertParam.pDstBuffer);
//mysrcImage.copyTo(srcImage);
//mysrcImage.release();
stConvertParam = { 0 };
}
else
{
srcImage = cv::Mat(0, 0, CV_8UC3).setTo(0);
}
if (pConvertData)
{
free(pConvertData);
pConvertData = NULL;
}
}
}
if(!srcImage.empty())
{
m_flag = true;
n_mutex->lock();
queuePic.append(srcImage);
n_mutex->unlock();
//统计图片成像时间
}
else
{
srcImage = cv::Mat(5, 5, CV_8UC1).setTo(0);
n_mutex->lock();
queuePic.append(srcImage);
n_mutex->unlock();
}
srcImage.release();
double time_End = (double)clock();
qDebug() << "[INFO] " "image pic:" << index++ << " srcImage Exist,Time:" << (time_End - time_Start) << "ms" << "--CameraName:" << QString::fromStdString(Username);
pData0 = { 0 };
}
//搜索所有设备
int SearchDevice()
{
memset(&m_stDevList, 0, sizeof(MV_CC_DEVICE_INFO_LIST));
// ch:枚举子网内所有设备 | en:Enumerate all devices within subnet
int nRet = MV_CC_EnumDevices(MV_GIGE_DEVICE || MV_USB_DEVICE, &m_stDevList);
for(int i=0; i<m_stDevList.nDeviceNum;i++)
{
unsigned char* name=m_stDevList.pDeviceInfo[i]->SpecialInfo.stGigEInfo.chSerialNumber;
string serialNumber = static_cast<string>((LPCSTR)name);
if(Username==serialNumber)
{
index=i;
break;
}
}
if (MV_OK != nRet)
{
return 0;
}
return -1;
}
Hd_MvCameraTL_module::Hd_MvCameraTL_module()
{
//m_thread = new MyThread;
//m_mutex = new QMutex();
}
void CloseDevice()
{
MV_CC_StopGrabbing(handle);
MV_CC_CloseDevice(handle);
MV_CC_DestroyHandle(handle);
}
Hd_MvCameraTL_module::~Hd_MvCameraTL_module()
{
CloseDevice();
if(n_mutex)
{
delete n_mutex;
n_mutex = nullptr;
}
qDebug() << "[INFO] " << " delete success!";
}
bool Hd_MvCameraTL_module::sendData(std::vector<cv::Mat> &mat,QByteArray &data)
{
if (data == "connect")
{
data = mv_Status;
return true;
}
if(queuePic.empty())
{
qCritical() << " [Error] " << " srcImage is null";
return false;
}
n_mutex->lock();
cv::Mat dstMat = queuePic.dequeue();
n_mutex->unlock();
mat.push_back(dstMat);
qCritical() << " [Error] " << " get image";
return true;
}
bool Hd_MvCameraTL_module::reciveData(std::vector<cv::Mat> &mat,QByteArray &data)
{
Q_UNUSED(mat)
m_flag = false;
Username= data.toStdString();
return true;
}
bool Hd_MvCameraTL_module::initParas(QByteArray&)
{
SearchDevice();
unsigned char* serialNumber=m_stDevList.pDeviceInfo[index]->SpecialInfo.stGigEInfo.chSerialNumber;
string userName = static_cast<string>((LPCSTR)serialNumber);
qDebug() << "[INFO] " << " start"<<"--UserName:"<<QString::fromStdString(userName);
if (handle != NULL)
{
MV_CC_StopGrabbing(handle);
MV_CC_CloseDevice(handle);
MV_CC_DestroyHandle(handle);
}
//打开相机
MV_CC_CreateHandle(&handle, m_stDevList.pDeviceInfo[index]);
int nRet = MV_CC_OpenDevice(handle);
if (MV_OK != nRet)
return false;
//触发模式
//MV_CC_SetEnumValue(handle, "TriggerMode", MV_TRIGGER_MODE_ON);
//MV_CC_SetEnumValue(handle, "TriggerSource", MV_TRIGGER_SOURCE_LINE0);
//加载用户集
nRet = MV_CC_SetEnumValueByString(handle, "UserSetSelector", "UserSet1");
if (MV_OK != nRet)
{
qDebug() << "Set UserSetSelector fail! nRet " << nRet;
}
// ch:注册抓图回调 | en:Register image callback
MV_CC_SetIntValueEx(handle, "GevHeartbeatTimeout", 3000);//心跳日志
nRet = MV_CC_RegisterImageCallBackEx(handle, ImageCallBackEx, handle);//注册回调
if (MV_OK != nRet)
return false;
nRet = MV_CC_RegisterExceptionCallBack(handle, ExceptionCB, NULL);//注册报警回调
if (MV_OK != nRet)
return false;
nRet = MV_CC_StartGrabbing(handle);
if (MV_OK != nRet)
return false;
return true;
}
bool Hd_MvCameraTL_module::run()
{
bool result = false;
try
{
n_mutex->lock();
if(queuePic.size() > 0)
result = true;
n_mutex->unlock();
}
catch (QString ev)
{
qDebug() << "[Error] " << " ev:" << ev ;
}
return result;
}
@@ -1,47 +0,0 @@
#ifndef HD_MVCAMERATL_MODULE_H
#define HD_MVCAMERATL_MODULE_H
#include <QtCore/qglobal.h>
#include <MvCameraControl.h>
#include <Windows.h>
#include <time.h>
#include <QThread>
#include <QQueue>
#include <QMutex>
#include "base.h"
using namespace cv;
using namespace std;
#pragma execution_character_set("utf-8")
static QByteArray mv_Status = "connected";//0106 新增相机断联报警
static long long index=0; //相机序号
static void* handle;
static string Username="";
static bool m_flag = false;
static MV_CC_DEVICE_INFO_LIST m_stDevList;//相机设备
class Hd_MvCameraTL_module :public Base
{
public:
Hd_MvCameraTL_module();
virtual ~Hd_MvCameraTL_module();
bool sendData(std::vector<cv::Mat>&,QByteArray&);
bool reciveData(std::vector<cv::Mat>&,QByteArray&);
bool initParas(QByteArray&);
bool run();
private:
//MyThread *m_thread = nullptr;
//QMutex* m_mutex;
};
extern "C"
{
Q_DECL_EXPORT Hd_MvCameraTL_module * create();
Q_DECL_EXPORT void destory(Hd_MvCameraTL_module * ptr);
}
#endif // HD_MVCAMERATL_MODULE_H
//Hd_MvCameraTL_module
-29
View File
@@ -1,29 +0,0 @@
#ifndef __BASECLASS_H__
#define __BASECLASS_H__
#include <iostream>
#include <QObject>
#include <QByteArray>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
class Base :public QObject
{
Q_OBJECT
public:
bool init_flag; //是否初始化,false,true
std::string paras; //传输数据
cv::Mat m_mat; //传输图片
std::string moduleName; //模块名称
public:
Base() {}
virtual ~Base() {}
virtual bool sendData(std::vector<cv::Mat>&,QByteArray&){return true;}
virtual bool reciveData(std::vector<cv::Mat>&,QByteArray&){return true;}
virtual bool initParas(QByteArray&){return true;}
virtual bool run() {return true;}
};
#endif
@@ -43,7 +43,7 @@ void _stdcall ExceptionCB(unsigned int nMesgType, void* pUser) {
MV_CC_CreateHandle(&handle, m_stDevList.pDeviceInfo[index]);
int nRet = MV_CC_OpenDevice(handle);
////触发模式
MV_CC_SetEnumValue(handle, "TriggerSource", MV_TRIGGER_SOURCE_SOFTWARE);
MV_CC_SetEnumValue(handle, "TriggerSource", MV_TRIGGER_SOURCE_LINE0);
MV_CC_SetEnumValue(handle, "TriggerMode", MV_TRIGGER_MODE_ON);
// //加载用户集
nRet = MV_CC_SetEnumValueByString(handle, "UserSetSelector", "UserSet1");
@@ -299,8 +299,8 @@ bool Hd_MvCamera_module::initParas(QByteArray&)
unsigned int nRet = MV_CC_CreateHandle(&handle, m_stDevList.pDeviceInfo[index]);
nRet = MV_CC_OpenDevice(handle);
////触发模式
nRet = MV_CC_SetEnumValue(handle, "TriggerSource", MV_TRIGGER_SOURCE_SOFTWARE);
nRet = MV_CC_SetEnumValue(handle, "TriggerMode", MV_TRIGGER_MODE_ON);
nRet = MV_CC_SetEnumValue(handle, "TriggerSource", MV_TRIGGER_SOURCE_LINE0);
nRet = MV_CC_SetEnumValue(handle, "TriggerMode", MV_TRIGGER_MODE_OFF);
// //加载用户集
nRet = MV_CC_SetEnumValueByString(handle, "UserSetSelector", "UserSet1");
if (MV_OK != nRet)
@@ -17,5 +17,8 @@ public:
~backEndController();
signals:
void sendErrorToMainwindow(backEndError);
void sendPixmapImageWidget(QPixmap img, imgWidgetShowType type,QString Name);
void sendPixmapImageWidget(QPixmap img, imgWidgetShowType type,int Index);
};
#endif
@@ -32,6 +32,10 @@ static MV_CC_DEVICE_INFO_LIST searchMvDevice()
cameraController::~cameraController()
{
for (auto camera : cameras)
{
delete camera.second;
}
for (auto module : camerasVec)
{
Base* base_ptr = module.module_ptr;
@@ -21,6 +21,11 @@ public:
cameraName = cameraModulePtr.key;
this->start();
}
~camera()
{
runFlag = false;
QThread::msleep(2000);
}
void run()
{
std::vector<cv::Mat>camera_mat;
@@ -35,13 +40,11 @@ public:
QThread::msleep(100);
}
}
void getCameraImg(std::vector<cv::Mat>& mats)
{
QByteArray task_name;
if (!cameraModulePtr.module_ptr->sendData(mats, task_name))
qCritical() << "[Error] " << " camera_mat is error! ";
qDebug() << __FUNCTION__ << " line:" << __LINE__ << "camera_mat size:" << mats.size();
if (cameraModulePtr.module_ptr->sendData(mats, task_name))
qDebug() << __FUNCTION__ << " line:" << __LINE__ << "camera_mat size:" << mats.size();
}
bool trigger()
{
@@ -63,6 +63,8 @@ public:
{
runFlag = false;
QThread::msleep(100);
delete trigger;
QThread::msleep(1000);
}
void init(backEndController* input);
void run()
@@ -162,7 +164,7 @@ private:
void decodeCameraCMD(QByteArray byte);
//触发器的配置
int startPos = 1;//数据读取的起始位
int interval = 10;//间隔
int interval = 50;//间隔
ReleaseFunction destory_finstcp; //释放
Base* trigger = nullptr;
@@ -12,7 +12,8 @@ public:
QHBoxLayout* Layout;
QLabel* icon, * Title;
QWidget* leftWidget, * rightWidget;
ImageWidget* imgWidget;
ImageWidgetController _ImageWidgetController;
//ImageWidget* imgWidget;
displayWidget()
{
this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
@@ -45,7 +46,7 @@ public:
palette.setColor(QPalette::WindowText, Qt::white);
QFont font("微软雅黑", 24, QFont::Bold);
QVBoxLayout* hLayout = new QVBoxLayout(leftWidget);
//hLayout->setContentsMargins(0, 0, 0, 0);
hLayout->setContentsMargins(0, 0, 0, 0);
Title = new QLabel(u8"主界面");
Title->setFont(font);
@@ -53,9 +54,10 @@ public:
Title->setAlignment(Qt::AlignLeft);
hLayout->addWidget(Title);
imgWidget = new ImageWidget();
hLayout->addWidget(imgWidget);
imgWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
hLayout->addWidget(&_ImageWidgetController);
_ImageWidgetController.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
_ImageWidgetController.createViewer(u8"相机1");
_ImageWidgetController.createViewer(u8"相机2");
}
void windowChanged()
{
+6
View File
@@ -18,4 +18,10 @@ enum backEndError
triggerConnectionError,
camerInitFailure
};
enum imgWidgetShowType
{
imgWidgetOri,
imgWidgetRes
};
#pragma once
+5
View File
@@ -10,6 +10,10 @@
#include <qlabel.h>
#include <qcombobox.h>
#include <backEndController.h>
void connectSignalAndSlots(MainWindow* front, backEndController* back)
{
}
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
@@ -29,6 +33,7 @@ int main(int argc, char* argv[])
//////////
backEndController _backEnd;
MainWindow w;
connectSignalAndSlots(&w,&_backEnd);
w.show();
return a.exec();
+4
View File
@@ -0,0 +1,4 @@
#pragma once
@@ -107,6 +107,7 @@ public:
m_image = pixmap.copy();
initShow();
}
void resetImage()
{
if (m_image.isNull())
@@ -244,10 +245,84 @@ protected:
}
private:
void showimg(cv::Mat& img)
{
scene->clear();
// 加载图像
cv::Mat matForQimg;
cvtColor(img, matForQimg, cv::COLOR_BGR2RGB);
QImage disImage = QImage((const unsigned char*)(matForQimg.data), matForQimg.cols, matForQimg.rows, QImage::Format_RGB888);
QPixmap pixmap = QPixmap::fromImage(disImage);
if (pixmap.isNull()) {
return;
}
auto item = scene->addPixmap(pixmap);
setSceneRect(pixmap.rect());
// 自适应缩放
fitInView(scene->itemsBoundingRect(), Qt::KeepAspectRatio);
// 设置视图
//setFixedSize(640, 480);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setMouseTracking(true);
if (rectGroup != nullptr)
delete rectGroup;
rectGroup = new QGraphicsItemGroup();
scene->addItem(rectGroup);
}
void showimg(QImage& img)
{
scene->clear();
// 加载图像
QPixmap pixmap = QPixmap::fromImage(img);
if (pixmap.isNull()) {
return;
}
auto item = scene->addPixmap(pixmap);
setSceneRect(pixmap.rect());
// 自适应缩放
fitInView(scene->itemsBoundingRect(), Qt::KeepAspectRatio);
// 设置视图
//setFixedSize(640, 480);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setMouseTracking(true);
if (rectGroup != nullptr)
delete rectGroup;
rectGroup = new QGraphicsItemGroup();
scene->addItem(rectGroup);
}
void showimg(QPixmap& img)
{
scene->clear();
// 加载图像
if (img.isNull()) {
return;
}
auto item = scene->addPixmap(img);
setSceneRect(img.rect());
// 自适应缩放
fitInView(scene->itemsBoundingRect(), Qt::KeepAspectRatio);
// 设置视图
//setFixedSize(640, 480);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setMouseTracking(true);
if (rectGroup != nullptr)
delete rectGroup;
rectGroup = new QGraphicsItemGroup();
scene->addItem(rectGroup);
}
QPixmap m_image;
bool m_isPan;
QPoint m_prevPan;
QGraphicsItemGroup* rectGroup = nullptr;
};
class ImageWidget : public QWidget {
@@ -311,22 +386,59 @@ public:
setContextMenuPolicy(Qt::CustomContextMenu);
connect(this, &QWidget::customContextMenuRequested, this, &ImageWidget::showContextMenu);
}
void setLabelText(const QString& text) {
void setTitle(const QString& text) {
label->setText(text);
}
void showOriImg(cv::Mat oriImgInput)
//set不一定显示,要根据当前显示的类型决定
void setOriImg(cv::Mat oriImgInput)
{
if (oriImgInput.empty()) {
return;
}
pixOriImg = QPixmap::fromImage(cvMatToQImage(oriImgInput).rgbSwapped());
if (pixOriImg.isNull()) {
return;
}
oriImg= oriImgInput;
if (MatType == false)
setImageFromMat(oriImgInput);
showImg(pixOriImg);
}
void showResImg(cv::Mat resImgInput)
//set不一定显示,要根据当前显示的类型决定
void setResImg(cv::Mat resImgInput)
{
resImg= resImgInput;
if (resImgInput.empty()) {
return;
}
pixResImg = QPixmap::fromImage(cvMatToQImage(resImgInput).rgbSwapped());
if (pixResImg.isNull()) {
return;
}
resImg = resImgInput;
if (MatType == true)
setImageFromMat(resImg);
showImg(pixResImg);
}
void setImageFromMat(cv::Mat imageMat) {
//set不一定显示,要根据当前显示的类型决定
void setOriImg(QPixmap oriImgInput)
{
pixOriImg = oriImgInput;
if (pixOriImg.isNull()) {
return;
}
if (MatType == false)
showImg(pixOriImg);
}
//set不一定显示,要根据当前显示的类型决定
void setResImg(QPixmap resImgInput)
{
pixResImg = resImgInput;
if (pixResImg.isNull()) {
return;
}
if (MatType == true)
showImg(pixResImg);
}
//无视当前类型直接显示
void showImg(cv::Mat& imageMat) {
if (imageMat.empty()) {
return;
}
@@ -340,34 +452,27 @@ public:
if (pixmap.isNull()) {
return;
}
//bool itemUpdated = false;
//for (QGraphicsItem* item : scene->items()) {
// QGraphicsPixmapItem* pixmapItem = dynamic_cast<QGraphicsPixmapItem*>(item);
// if (pixmapItem) {
// pixmapItem->setPixmap(pixmap);
// itemUpdated = true;
// break;
// }
//}
//if (!itemUpdated) {
// QGraphicsPixmapItem* item = new QGraphicsPixmapItem(pixmap);
// scene->addItem(item);
//}
view->setPixmap(pixmap);
//view->fitInView(scene->itemsBoundingRect(), Qt::KeepAspectRatio);
}
void showImg(QPixmap& imageMat) {
view->setPixmap(imageMat);
}
void switchOriAndRes()//切换原图和结果图
{
if (MatType == false)
{
setImageFromMat(resImg);
if(pixOriImg.isNull())
showImg(resImg);
else
showImg(pixResImg);
label2->setText(u8"结果图");
}
else
{
setImageFromMat(oriImg);
if (pixOriImg.isNull())
showImg(oriImg);
else
showImg(pixOriImg);
label2->setText(u8"原图");
}
MatType = !MatType;
@@ -411,6 +516,9 @@ private:
}
cv::Mat oriImg;
cv::Mat resImg;
QPixmap pixOriImg;
QPixmap pixResImg;
bool MatType = false;//false ori true Res
int in = 0;
QLabel* label;
@@ -419,50 +527,86 @@ private:
//QGraphicsPixmapItem* item;
SonGraphicsView* view;
};
class ImageWidgetController
class ImageWidgetController :public QWidget
{
public:
QMutex mutex;
QList< ImageWidget*>ImageWidgetList;
std::unordered_map<std::string, ImageWidget*>map;
ImageWidget* createViewer(std::string nickName = "none")
QGridLayout* Layout = new QGridLayout();
ImageWidgetController()
{
this->setLayout(Layout);
Layout->setContentsMargins(0, 0, 0, 0);
}
ImageWidget* createViewer(QString nickName = "none")
{
ImageWidget* ImageView = new ImageWidget();
ImageWidgetList.push_back(ImageView);
if (nickName != "none")
map.insert({ nickName,ImageView });
ImageView->setTitle(nickName);
Layout->addWidget(ImageView);
return ImageView;
}
bool showOriImg(cv::Mat img, int index)
QMutex mutex;
QList< ImageWidget*>ImageWidgetList;
std::unordered_map<QString, ImageWidget*>map;
bool setImg(cv::Mat img, imgWidgetShowType _type , int index)
{
if (index > ImageWidgetList.size())
return false;
if (img.channels() == 1)
cv::cvtColor(img, img, cv::COLOR_GRAY2BGR);
ImageWidgetList[index]->showOriImg(img);
switch (_type)
{
case imgWidgetOri:
ImageWidgetList[index]->setOriImg(img);
break;
case imgWidgetRes:
ImageWidgetList[index]->setResImg(img);
break;
}
}
bool showResImg(cv::Mat img, int index)
bool setImg(cv::Mat img, imgWidgetShowType _type, QString nickName)
{
if (map.find(nickName) == map.end())
return false;
switch (_type)
{
case imgWidgetOri:
map[nickName]->setOriImg(img);
break;
case imgWidgetRes:
map[nickName]->setResImg(img);
break;
}
}
bool setImg(QPixmap img, imgWidgetShowType _type, int index)
{
if (index > ImageWidgetList.size())
return false;
if (img.channels() == 1)
cv::cvtColor(img, img, cv::COLOR_GRAY2BGR);
ImageWidgetList[index]->showResImg(img);
switch (_type)
{
case imgWidgetOri:
ImageWidgetList[index]->setOriImg(img);
break;
case imgWidgetRes:
ImageWidgetList[index]->setResImg(img);
break;
}
}
bool showOriImg(cv::Mat img, std::string nickName)
bool setImg(QPixmap img, imgWidgetShowType _type, QString nickName)
{
if (map.find(nickName) == map.end())
return false;
if (img.channels() == 1)
cv::cvtColor(img, img, cv::COLOR_GRAY2BGR);
map[nickName]->showOriImg(img);
}
bool showResImg(cv::Mat img, std::string nickName)
{
if (map.find(nickName) == map.end())
return false;
if (img.channels() == 1)
cv::cvtColor(img, img, cv::COLOR_GRAY2BGR);
map[nickName]->showResImg(img);
switch (_type)
{
case imgWidgetOri:
map[nickName]->setOriImg(img);
break;
case imgWidgetRes:
map[nickName]->setResImg(img);
break;
}
}
};
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.