在 OpenCV 的 addWeighted
函数中,参数应该是 double
类型的权重值和图像矩阵。你遇到的错误是因为使用了条件表达式,它返回的是 cv::Scalar
类型,而 addWeighted
的参数期望的是 double
类型。
为了修复这个问题,你需要确保传递给 addWeighted
的所有参数都是正确的类型。这里的目标是根据得分决定遮罩的贡献,但没有必要把遮罩乘以 alpha
。
下面是更正后的代码示例:
#include "../pre_process/ImageQuality.h" // 确保这个路径是正确的并且包含BRISQUE函数的实现
#include <opencv2/opencv.hpp>
#include <iostream>
int main()
{
cv::Mat img1;
double score; // 将 score 的类型更改为 double
img1 = cv::imread("Data/img_in/5.bmp");
if (img1.empty()) {
std::cerr << "Error: Could not open image." << std::endl;
return -1;
}
int blockSize = 320; // 块大小320x320
cv::Mat resultImage = img1.clone(); // 创建结果图像
cv::Mat greenMask(img1.size(), CV_8UC3, cv::Scalar(0, 0, 0)); // 初始化绿色遮罩
cv::Mat blueMask(img1.size(), CV_8UC3, cv::Scalar(0, 0, 0)); // 初始化蓝色遮罩
for (int row = 0; row < img1.rows / blockSize; ++row) {
for (int col = 0; col < img1.cols / blockSize; ++col) {
// 定义当前小块的矩形区域
cv::Rect roi(col * blockSize, row * blockSize, blockSize, blockSize);
cv::Mat smallBlock = img1(roi);
// 计算 BRISQUE 得分
score = BRISQUE(smallBlock);
if (score < 30.0) {
rectangle(greenMask, roi, cv::Scalar(0, 255, 0), cv::FILLED);
}
else {
rectangle(blueMask, roi, cv::Scalar(255, 0, 0), cv::FILLED);
}
}
}
// 将原图与遮罩合成,设置透明度,例如:透明度为50%
double alpha = 0.5;
addWeighted(resultImage, alpha,
greenMask,
alpha,
0.0,
resultImage);
addWeighted(resultImage.clone(), alpha,
blueMask,
alpha,
0.0,
resultImage);
imwrite("Data/img_out/marked_result.bmp", resultImage);
imshow("Result Image", resultImage);
cv::waitKey(0);
return 0;
}
更改说明:
- 在调用
addWeighted
时,将第二个和第三个参数(来自于蓝色和绿色遮罩)直接作为输入,而不进行任何条件运算。 - 使用两次调用
addWeighted
来分别添加两个遮罩,以确保每个遮罩都能正确地影响最终图像。
请测试此修改,并告诉我是否解决了您的问题!
内容由零声教学AI助手提供,问题来源于学员提问