opencv c++获取不规则的roi区域
时间: 2023-09-09 21:14:44 浏览: 97
要获取不规则的 ROI 区域,可以通过以下步骤使用 OpenCV C++ 实现:
1. 创建一个与原始图像大小相同的掩码图像(mask image),并将其初始化为全黑色。
```cpp
cv::Mat mask = cv::Mat::zeros(image.size(), CV_8UC1);
```
2. 在掩码图像上绘制不规则区域。可以使用 OpenCV 的绘图函数,如 `cv::polylines` 或 `cv::fillPoly`,根据提供的点集来绘制多边形。
```cpp
std::vector<std::vector<cv::Point>> contours;
// 将不规则区域的点坐标添加到 contours 向量中
cv::fillPoly(mask, contours, cv::Scalar(255));
```
3. 将掩码图像与原始图像进行按位与操作,以获取不规则 ROI 区域。
```cpp
cv::Mat roi;
image.copyTo(roi, mask);
```
现在,`roi` 图像就是原始图像中的不规则 ROI 区域。
请注意,上述代码中的 `image` 是输入图像,`contours` 是包含不规则区域点坐标的向量。你可以根据实际情况进行调整和修改。
相关问题
opencv c++ ROI 手动设定曝光 代码
以下是使用 OpenCV C++ 实现手动设定 ROI 曝光的代码示例:
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// 读取图像
Mat img = imread("test.jpg");
// 创建窗口并显示图像
namedWindow("Image", WINDOW_NORMAL);
imshow("Image", img);
// 选择 ROI 区域
Rect roi = selectROI("Image", img);
// 设定曝光值
double exposure = 1.5;
// 对 ROI 区域进行曝光
Mat roi_img = img(roi);
roi_img.convertTo(roi_img, -1, exposure);
// 显示处理后的图像
imshow("Image", img);
waitKey(0);
return 0;
}
```
代码解析:
1. 首先读取一张图片并显示在窗口中;
2. 调用 `selectROI` 函数选择感兴趣的区域,返回一个 `Rect` 对象;
3. 设定曝光值,这里我们假设曝光值为 1.5;
4. 使用 `convertTo` 函数对 ROI 区域进行曝光处理;
5. 最后再次显示处理后的图像。
注意事项:
1. 在选择 ROI 区域时需要按住鼠标左键进行拖拽;
2. 代码中的 `selectROI` 函数需要用户手动编译 OpenCV 库时进行选择,否则可能会出现链接错误;
3. 代码中的曝光值为常量,实际应用中可以通过用户输入动态获取。
鼠标框选roi区域c++程序
以下是使用OpenCV库在C++中实现鼠标框选ROI区域的程序:
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
Rect roi;
bool drawing = false;
void select_roi(int event, int x, int y, int flags, void* userdata) {
if (event == EVENT_LBUTTONDOWN) {
roi.x = x;
roi.y = y;
drawing = true;
}
else if (event == EVENT_MOUSEMOVE && drawing) {
Mat img = *(Mat*)userdata;
rectangle(img, Point(roi.x, roi.y), Point(x, y), Scalar(0, 255, 0), 2);
}
else if (event == EVENT_LBUTTONUP) {
roi.width = abs(x - roi.x);
roi.height = abs(y - roi.y);
drawing = false;
}
}
int main() {
Mat img = imread("image.jpg");
namedWindow("image");
setMouseCallback("image", select_roi, &img);
while (true) {
imshow("image", img);
if (waitKey(1) == 'q') {
break;
}
if (roi.width > 0 && roi.height > 0) {
Mat roi_img = img(roi);
// 在ROI区域上进行操作
}
}
return 0;
}
```
在这个程序中,我们首先定义了一个`Rect`类型的变量`roi`,用于存储ROI区域的坐标和大小。我们还定义了一个布尔类型的变量`drawing`,用于记录是否正在绘制矩形框。
我们使用`setMouseCallback`函数来设置鼠标事件的回调函数。在回调函数中,我们检查鼠标事件的类型,如果是鼠标左键按下,就记录下鼠标的坐标,并将`drawing`设为true。如果是鼠标移动,且`drawing`为true,就在图像上绘制矩形框。如果是鼠标左键释放,就计算出矩形框的大小,并将`drawing`设为false。
在主循环中,我们展示图像,并等待用户操作。如果用户按下了`q`键,就退出循环。如果ROI区域的大小大于0,就根据ROI区域的坐标和大小获取ROI区域图像,并在ROI区域上进行操作。
完整代码可以进行编译和运行。