我正在使用 OpenCV/Qt 创建一个简单的图像处理应用程序,我正在寻找一种方法来优化我创建的代码 (https://github.com/krslynx/ImageProcessingApplication)。目前,每次在应用程序中移动 slider 时,都会调用相应的方法来更改图像,例如:
/** ActionEvent for the brightness slider moving */
void MainWindow::on_brightnessSlider_sliderMoved() {
//setBrightness is the method called
updateImage(ui->pixmap, setBrightness(this->image, ui->brightnessSlider->value());
}
updateImage 方法更新存储图像的 QLabel (ui->pixmap
)。这会带来一个问题,因为 cv::Mat image/this->image
是在每个 ActionEvent 中调用的原始图像,因此如果移动 Brightness Slider,然后移动 Contrast Slider,亮度由于 slider 取决于 this->image
而不是设置的 QLabel 像素图,因此不会保留更改。我使用以下代码“解决”了这个问题:
/** ActionEvent for the brightness slider moving */
void MainWindow::on_brightnessSlider_sliderMoved() {
cv::Mat result = this->image;
result = setBrightness(result, ui->brightnessSlider->value());
result = setContrast(result, ui->contrastSlider->value());
result = setSharpness(result, ui->sharpnessSlider->value());
result = setZoom(result, ui->zoomSlider->value());
updateImage(ui->pixmap, result);
}
虽然这段代码提供了我需要的精确视觉效果,但这意味着每个 Action 事件都需要包含上述所有代码(而且我需要为我添加的每个新功能不断添加代码),我重新-处理我已经处理过的东西。在处理已移动所有 slider 的较大图像时,有时可能需要超过 1.1 秒的时间来处理。
我试图通过引用更改全局图像 this->image
,甚至为更改后的图像创建另一个全局图像但是我遇到了问题,当我移动亮度/对比度/锐度/向上/向下缩放 slider ,它会变化得太剧烈。
任何指点将不胜感激!我是 C++ 的新手!
最佳答案
创建一个单独的函数,根据 slider 的值更新图像。例如有这样的功能
void MainWiondow::generic_sliderMoved() {
cv::Mat result = this->image;
result = setBrightness(result, ui->brightnessSlider->value());
result = setContrast(result, ui->contrastSlider->value());
result = setSharpness(result, ui->sharpnessSlider->value());
result = setZoom(result, ui->zoomSlider->value());
updateImage(ui->pixmap, result);
}
您可以将每个 slider 的 Action 事件设置为该函数。如果某些 slider 需要更多功能,那么您可以制作一个不同的 Action 事件函数来调用该函数,如下所示:
/** ActionEvent for the brightness slider moving */
void MainWindow::on_brightnessSlider_sliderMoved() {
/* brightness slider specific code */
generic_sliderMoved();
}
关于c++ - OpenCV/C++ 中的优化帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7841796/