cv::Mat .setTo
时间: 2024-01-10 17:02:25 浏览: 34
cv::Mat::setTo() 是 OpenCV 库中的一个函数,用于将图像的所有像素值设置为指定的值。
它有多种重载形式,最常用的形式是:
```cpp
void cv::Mat::setTo(const cv::Scalar& value, const cv::Mat& mask = cv::noArray());
```
该函数将图像中的所有像素值设置为指定的标量值。参数`value`是一个 `cv::Scalar` 对象,用于指定要设置的像素值。参数`mask`是一个可选的掩码图像,用于选择要设置的像素区域。如果不提供掩码图像,则所有像素都被设置为指定的值。
此外,还有其他一些重载形式,可以使用不同的数据类型和通道数来设置像素值。
注意:在使用 `setTo()` 函数之前,需要确保目标图像已经被创建并分配了内存空间。
相关问题
c++ 代码实现将下图代码的obj.seg渲染在image上,obj.seg是yolov8预测出来的mask图, cv::Mat image = cv::imread("inference/yq.jpg"); auto yolo = yolo::load("/home/zhangyu/tensorrt_code/test/1.18-integrate-full-yolov5/workspace/last.transd.trtmodel", yolo::Type::V8Seg); if (yolo == nullptr) return; auto objs = yolo->forward(cvimg(image)); int i = 0; for (auto &obj : objs) { uint8_t b, g, r; tie(b, g, r) = yolo::random_color(obj.class_label); cv::rectangle(image, cv::Point(obj.left, obj.top), cv::Point(obj.right, obj.bottom), cv::Scalar(b, g, r), 5); auto name = cocolabels[obj.class_label]; auto caption = cv::format("%s %.2f", name, obj.confidence); int width = cv::getTextSize(caption, 0, 1, 2, nullptr).width + 10; cv::rectangle(image, cv::Point(obj.left - 3, obj.top - 33), cv::Point(obj.left + width, obj.top), cv::Scalar(b, g, r), -1); cv::putText(image, caption, cv::Point(obj.left, obj.top - 5), 0, 1, cv::Scalar::all(0), 2, 16); if (obj.seg) { // cv::imwrite(cv::format("%d_mask.jpg", i), // cv::Mat(obj.seg->height, obj.seg->width, CV_8U, obj.seg->data)); i++; } } printf("Save result to Result.jpg, %d objects\n", (int)objs.size()); cv::imwrite("Result.jpg", image); }
要实现将 obj.seg 渲染在 image 上,可以按照以下步骤进行:
1. 将 obj.seg 转换成 cv::Mat 格式的图像,即将 obj.seg->data 拷贝到 cv::Mat 中,并设置其大小为 obj.seg->height 和 obj.seg->width。
2. 将 obj.seg 的像素值中为 1 的部分渲染成指定颜色的矩形框。
代码实现如下:
```c++
cv::Mat image = cv::imread("inference/yq.jpg");
auto yolo = yolo::load("/home/zhangyu/tensorrt_code/test/1.18-integrate-full-yolov5/workspace/last.transd.trtmodel", yolo::Type::V8Seg);
if (yolo == nullptr) return;
auto objs = yolo->forward(cvimg(image));
int i = 0;
for (auto &obj : objs) {
uint8_t b, g, r;
tie(b, g, r) = yolo::random_color(obj.class_label);
cv::rectangle(image, cv::Point(obj.left, obj.top), cv::Point(obj.right, obj.bottom),
cv::Scalar(b, g, r), 5);
auto name = cocolabels[obj.class_label];
auto caption = cv::format("%s %.2f", name, obj.confidence);
int width = cv::getTextSize(caption, 0, 1, 2, nullptr).width + 10;
cv::rectangle(image, cv::Point(obj.left - 3, obj.top - 33),
cv::Point(obj.left + width, obj.top), cv::Scalar(b, g, r), -1);
cv::putText(image, caption, cv::Point(obj.left, obj.top - 5), 0, 1, cv::Scalar::all(0), 2, 16);
if (obj.seg) {
cv::Mat seg_image(obj.seg->height, obj.seg->width, CV_8U, obj.seg->data);
cv::Mat seg_color;
cv::cvtColor(seg_image, seg_color, cv::COLOR_GRAY2BGR);
cv::Vec3b color(b, g, r);
seg_color.setTo(color, seg_image == 1);
cv::Rect seg_rect(obj.left, obj.top, obj.right - obj.left, obj.bottom - obj.top);
seg_color.copyTo(image(seg_rect));
i++;
}
}
printf("Save result to Result.jpg, %d objects\n", (int)objs.size());
cv::imwrite("Result.jpg", image);
```
其中,将 obj.seg 转换成 cv::Mat 格式的图像使用了以下代码:
```c++
cv::Mat seg_image(obj.seg->height, obj.seg->width, CV_8U, obj.seg->data);
```
将 obj.seg 的像素值中为 1 的部分渲染成指定颜色的矩形框使用了以下代码:
```c++
cv::Mat seg_color;
cv::cvtColor(seg_image, seg_color, cv::COLOR_GRAY2BGR);
cv::Vec3b color(b, g, r);
seg_color.setTo(color, seg_image == 1);
cv::Rect seg_rect(obj.left, obj.top, obj.right - obj.left, obj.bottom - obj.top);
seg_color.copyTo(image(seg_rect));
```
以cv::Mat::set举个例子
好的,假设有如下代码:
```
cv::Mat img = cv::Mat::zeros(3, 3, CV_8UC1);
img.setTo(255);
```
这个代码中,我们首先创建了一个大小为3x3的单通道图像 img,并使用 cv::Mat::zeros 函数将其所有像素点都设置为0。接着,我们使用 cv::Mat::setTo 函数将所有像素点都设置为255,这样整个图像就变成了一个全白的图像。
cv::Mat::setTo 函数的第一个参数为要设置的颜色值,可以是一个标量(如上例中的255),也可以是一个向量或矩阵。如果要设置的是一个标量,可以直接传入一个数值;如果要设置的是一个向量或矩阵,需要先使用 cv::Scalar、cv::Vec 或 cv::Matx 等类来创建。
cv::Mat::setTo 函数还可以接受一个可选的掩码参数,用于指定哪些像素点需要被设置。如果掩码值为0,则对应像素点不会被设置。如果掩码值为非0,则对应像素点会被设置为指定颜色值。