cv::Mat.size
时间: 2023-07-03 12:22:10 浏览: 60
`cv::Mat.size` 是 `cv::Mat` 类的成员函数之一,用于返回矩阵的尺寸信息。
`cv::Mat` 是 OpenCV 库中用于表示图像、矩阵和张量等数据结构的类。矩阵的尺寸信息是指矩阵的行数和列数。`size()` 函数返回的是一个 `cv::Size` 类型的对象,包含了矩阵的尺寸信息。
`cv::Size` 是 OpenCV 库中的另一个类,用于表示二维图像或矩阵的尺寸。`cv::Size` 类包含了两个整型成员变量,分别表示图像或矩阵的宽度和高度。
在使用 `cv::Mat` 类时,您可以使用 `size()` 函数获得矩阵的尺寸信息,例如:
```c++
cv::Mat image = cv::imread("test.jpg");
cv::Size size = image.size();
std::cout << "Image size: " << size.width << " x " << size.height << std::endl;
```
上述代码中,`cv::imread()` 函数用于读取一张图像文件,返回一个 `cv::Mat` 类型的对象。通过调用 `size()` 函数,可以获得图像的尺寸信息,并打印到控制台上。
相关问题
cv::Mat.size[1]
`cv::Mat.size` 是一个数组,用于存储 `cv::Mat` 对象的维度信息。如果 `cv::Mat` 是一个二维矩阵,那么 `size` 数组的第一个元素是行数,第二个元素是列数。因此,`cv::Mat.size[1]` 表示 `cv::Mat` 的第二维大小,即列数。
例如,如果我们有一个 `cv::Mat` 对象 `img`,我们可以使用 `size` 数组来获取它的行数和列数,如下所示:
```cpp
cv::Mat img = cv::imread("image.jpg");
int rows = img.size[0];
int cols = img.size[1];
```
这里,`size[0]` 表示 `cv::Mat` 的第一维大小,即行数,而 `size[1]` 表示第二维大小,即列数。因此,`cols` 变量将保存 `img` 的列数。
c++ 代码实现:下面说明obj.seg是yolov8预测出来的mask图,要求将obj.seg 上采样之后再渲染到原图上 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); }
可以使用cv::resize函数对obj.seg进行上采样,然后使用cv::addWeighted函数将上采样后的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::Mat seg(obj.seg->height, obj.seg->width, CV_8U, obj.seg->data);
cv::resize(seg, seg, image.size(), cv::INTER_LINEAR);
// 颜色映射
cv::Mat color_map;
cv::applyColorMap(seg, color_map, cv::COLORMAP_JET);
// 叠加
cv::addWeighted(color_map, 0.5, image, 0.5, 0, image);
// 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);
```