我有一个 qCustomPlot colorMap,以这种方式创建:
void MainWindow::plot_color_map(QCustomPlot *customPlot, cv::Mat image)
cv::Mat rotated_matrix = cv::Mat(image.rows,image.cols,CV_64FC3);
rotated_matrix.release();
rotate_90n(image,rotated_matrix,90);
customPlot->clearGraphs();
customPlot->clearPlottables();
customPlot->axisRect()->setupFullAxesBox(true);
customPlot->xAxis->setLabel("x");
customPlot->yAxis->setLabel("y");
customPlot->xAxis->setScaleRatio(customPlot->yAxis,1.0);
QCPColorMap *colorMap = new QCPColorMap(customPlot->xAxis,customPlot->yAxis);
customPlot->addPlottable(colorMap);
colorMap->data()->setSize(rotated_matrix.rows,rotated_matrix.cols);
colorMap->data()->setRange(QCPRange(0,rotated_matrix.cols),QCPRange(0,rotated_matrix.rows));
for(int col = 0; col < rotated_matrix.cols; ++col) {
for(int row = 0; row < rotated_matrix.rows; row++) {
colorMap->data()->setCell(row,col,rotated_matrix.at<double>(row,col));
}
}
QCPColorScale *colorScale = new QCPColorScale(customPlot);
double min,max;
cv::minMaxLoc(rotated_matrix,&min,&max);
qDebug() << min << " " << max;
customPlot->plotLayout()->addElement(0,1,colorScale);
colorScale->setType(QCPAxis::atRight);
colorMap->setColorScale(colorScale);
colorMap->setGradient(QCPColorGradient::gpJet);
colorMap->rescaleDataRange();
QCPMarginGroup *marginGroup = new QCPMarginGroup(customPlot);
customPlot->axisRect()->setMarginGroup(QCP::msBottom | QCP::msTop, marginGroup);
colorScale->setMarginGroup(QCP::msBottom | QCP::msTop, marginGroup);
customPlot->rescaleAxes();
customPlot->replot();
colorMap 显示得很好,比例范围与我输出到控制台的“min”和“max”值相匹配。
但是,如果我随后更改 cv::Mat 图像中的数据,则比例不会更新。
例如,如果一开始数据范围是 0.2 到 7.3,那么无论我之后选择绘制什么数据,比例尺都停留在 0.2 到 7.3 之间,它不会改变以反映新的数据集。
任何想法如何让比例自动更新以匹配数据范围?
如果我关闭并重新打开程序,第一次运行该功能,比例总是正确的,只有在绘制另一个图像后它才不会改变。
谢谢米奇