ImageWatch,图片放大之后可以查看灰度图像每个像素点的值
想用qt实现一下这个功能 在网上查询之后在https://libaineu2004.blog.csdn.net/article/details/124217848?spm=1001.2014.3001.5502指导下 自己按照自己项目的需求完善了这个类似功能
感谢:libaineu2004
需求:高帧率灰度图像一直在软件界面输出,想做到实时刷新 能够看见每个像素坐标点下的像素值 做到ImageWatch之类的效果
环境:Qt5.13.2+vs2015
实现:
1.高帧率刷新的灰度图像
2.以滚动条拉伸的像素网格图
具体实现:QGraphicsView接收图像数据 显示图像;
重写QGraphicsView鼠标右键事件自定义信号
void fun_GraphicsView::mousePressEvent(QMouseEvent* e)
{
if (e->button() == Qt::RightButton)
{
emit Leftclick();
}
}
信号槽 开始创建表格
connect(ui->GraphicsView, SIGNAL(Leftclick()), this, SLOT(set_LeftclickView0()));
//图像数据表
void set_LeftclickView0()
{
tablewidget_open = true;
ui->tableWidget->setVisible(true);
ui->imageBox0->setVisible(false);
ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
ui->tableWidget->verticalHeader()->setStretchLastSection(true);
ui->tableWidget->setRowCount(img_height); //设置行数 图片的高度
ui->tableWidget->setColumnCount(img_width); //设置列数 图片的宽度
inti_qtablewidget();//设置网格数据
}
int HScrol_tableWidget = 0;//记录高的滑块位置
int WScrol_tableWidget = 0;//记录宽的滑块位置
//图像宽高过大 用tableWidget一次显示所有网格数据卡顿 改变为移动到某个位置显示某个区域当前的图像数据
connect(ui->tableWidget->horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(acceptHScrollValueChanged(int)));
connect(ui->tableWidget->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(acceptVScrollValueChanged(int)));
void disp::acceptHScrollValueChanged(int value)
{//宽
WScrol_tableWidget = value;
if (WScrol_tableWidget < 30)
return;
inti_qtablewidget();//设置网格数据
}
void disp::acceptVScrollValueChanged(int value)
{//高
HScrol_tableWidget = value;
if (HScrol_tableWidget < 30)
return;
inti_qtablewidget();//设置网格数据
}
//设置网格数据 根据获取的宽高滑块的大小从全局的图像buffer里面取值 (30格子内偏移量)
void inti_qtablewidget()
{
for (int rows = HScrol_tableWidget; rows <HScrol_tableWidget + 30; rows++)//8
{
if (rows >= img_height)
break;
for (int columns = WScrol_tableWidget; columns <WScrol_tableWidget+30; columns++)//255
{
if (columns >= img_width)
break;
int j = (unsigned char)buffer[img_width*rows + columns];
ui->tableWidget->setItem(rows, columns, new QTableWidgetItem(QString::number(j, 16)));
ui->tableWidget->item(rows, columns)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
}
}
}
//buffer改变网格数据随之改变 根据宽高滑块取当前buffer的某个范围数据 然后inti_qtablewidget()显示出来 就i做到实时显示 的效果了