精华内容
下载资源
问答
  • opencv任意形状ROI

    2015-01-26 15:32:46
    Mat srcImg = imread("lena.jpg"); Mat dstImg; Mat mask = Mat::zeros(srcImg.size(),CV_8UC1); vector<vector<Point>> contour; vector<Point> pts;...imshow("roi",dstImg); waitKey();
    Mat srcImg = imread("lena.jpg");
    
    Mat dstImg;
    Mat mask = Mat::zeros(srcImg.size(),CV_8UC1);

    vector<vector<Point>> contour;
    vector<Point> pts;
    pts.push_back(Point(30,45));
    pts.push_back(Point(500,35));
    pts.push_back(Point(430,240));
    pts.push_back(Point(50,250));
    contour.push_back(pts);

    drawContours(mask,contour,0,Scalar::all(255),-1);
    srcImg.copyTo(dstImg,mask);

    imshow("src",srcImg);
    imshow("mask",mask);
    imshow("roi",dstImg);
    waitKey();
    展开全文
  • OpenCV实现将任意形状ROI区域置黑

    千次阅读 2019-10-23 20:01:30
    比较常用的是将 Rect 矩形区域置黑,代码如下: int testMaskRectROI() { cv::Mat image = cv::imread("./test_img/detect_pic.jpeg"); cv::Rect rect_mask(57, 93, 92, 92); cv::Mat subImage = image(rect_...

    比较常用的是将 Rect 矩形区域置黑,代码如下:

    int testMaskRectROI() {
        cv::Mat image = cv::imread("./test_img/detect_pic.jpeg");
    
        cv::Rect rect_mask(57, 93, 92, 92);
        cv::Mat subImage = image(rect_mask);
        subImage.setTo(0);
    
        cv::imshow("src", image);
        cv::waitKey(0);
    }
    

    效果如下:
    在这里插入图片描述
    但在做人脸检测的旋转追踪时,矩形框是随角度旋转的,那如何处理呢?直接上代码:

    int testMaskAnyROI() {
        cv::Mat image = cv::imread("./test_img/detect_pic.jpeg");
    
        vector<cv::Point> contour;
        contour.push_back(cv::Point(66, 80));
        contour.push_back(cv::Point(38, 177));
        contour.push_back(cv::Point(134, 205));
        contour.push_back(cv::Point(162, 108));
    
        vector<vector<cv::Point> > contours;
        contours.push_back(contour);
        cv::drawContours(image, contours, -1, cv::Scalar::all(0), CV_FILLED);
    
        cv::imshow("src", image);
        cv::waitKey(0);
    }
    

    效果如下:
    在这里插入图片描述

    展开全文
  • 这里介绍利用 OpenCV 截取任意形状ROI的基本思路。会使用到的几个比较重要的方法有: 直线拟合:cv.fitLine 旋转矩阵:cv.getRotationMatrix2D 仿射变换:cv.warpAffine 轮廓绘制:cv.drawContours 图像融合:cv.add...

    规则矩形的ROI提取可以使用 numpy 的数据切片操作,但是真实场景的ROI形状并不规则,可能伴随着旋转角度、多点折线等特征。这里介绍利用 OpenCV 截取任意形状ROI的基本思路。会使用到的几个比较重要的方法有:

    直线拟合:cv.fitLine
    旋转矩阵:cv.getRotationMatrix2D
    仿射变换:cv.warpAffine
    轮廓绘制:cv.drawContours
    图像融合:cv.add
    外接框拟合:cv.minAreaRect
    

    一、基本思路

    这里针对的是一般的 BGR 图像,ROI 以二维坐标点的形式给出,可以是多个点、多边形。

    • 计算 ROI 的倾斜角度 α \alpha α
    • 将原始图像不剪切、反方向旋转 α \alpha α
    • 计算 ROI 在旋转后图像中的位置;
    • 计算 ROI 在旋转后图像中的掩码;
    • 图像融合,ROI 截取。

    二、代码实现

    import cv2 as cv
    import numpy as np
    import math
    
    def crop(image, pts):
        '''
        :param image: numpy.array, origin image
        :param pts: numpy.array, points of bbox at any angle, shape with (-1, 2)
        :return:
        '''
    
        h, w = image.shape[:2]
    
        # 计算 ROI 的倾斜角度
        cos_a, sin_a, _, _ = cv.fitLine(pts, cv.DIST_L2, 0, 0.01, 0.01)
        angle = math.asin(sin_a) * 180 / math.pi	# 此处需要注意角度的正负
    
        # 根据 ROI 倾斜角计算旋转矩阵,旋转中心就是 ROI 的中心
        cX, cY = np.mean(pts[:, 0]), np.mean(pts[:, 1])
        M = cv.getRotationMatrix2D((cX, cY), angle, 1)
        cos = np.abs(M[0, 0])
        sin = np.abs(M[0, 1])
    
        # 计算旋转之后图像的宽度和高度
        nW = int((h * sin) + (w * cos))
        nH = int((h * cos) + (w * sin))
    
        # 调整旋转矩阵
        M[0, 2] += (nW / 2) - cX
        M[1, 2] += (nH / 2) - cY
    
        # 旋转图像
        image = cv.warpAffine(image, M, (nW, nH), borderValue=(255, 255, 255))
    
        # 计算旋转之后的 ROI
        pts = np.pad(pts, pad_width=((0, 0), (0, 1)), mode='constant', constant_values=((0, 0), (0, 1))).reshape((-1, 3, 1))
        pts = [np.dot(M, pts[i]) for i in range(pts.shape[0])]
        pts = np.array(pts, np.int32).reshape((-1, 1, 2))
    
        # 计算 ROI 掩码
        mask = np.zeros((nH, nW, 3), dtype=np.uint8) + 255
        mask = cv.drawContours(mask, [pts], -1, (0, 0, 0), -1)
        
        # 掩码融合
        image = cv.add(image, mask)
        
        # 截取规则图像
        rect = cv.minAreaRect(pts)
        box = np.int0(cv.boxPoints(rect))
        roi = image[min(box[:, 1]):max(box[:, 1]), min(box[:, 0]):max(box[:, 0])]
        
        return roi
    

    几点说明:

    • 这里完成的ROI提取附带着将ROI旋转为水平角度,如果不需要旋转,可以省略旋转矩阵计算、原图旋转等步骤;
    • 最终ROI图像还是要以 (w, h, c) 的形式返回,所以对不规则ROI这里采用白色背景填充(掩码和融合方式决定的),如果要用黑色背景填充可以考虑下面的方式,但是掩码需要改为黑色背景、白色ROI:
    cv2.add(image, np.zeros(np.shape(image), dtype=np.uint8), mask=mask)
    
    • 对于初始ROI的获取,可以人为交互式地从图像中选一些点,也可以用 cv.findContours 去计算轮廓;
    展开全文
  • OpenCV截取图像ROI任意形状

    千次阅读 2015-12-16 11:37:39
    srcROI.copyTo(dst1,mask); imwrite("dst1.jpg",dst1); bitwise_not(mask,mask); dstROI.copyTo(dst2,mask); dstROI.setTo(0); dstROI=dst1+dst2; imshow("final result",dst); ...
    //1.First create mask image as described above
    
    //2.Copy the source image to new Mat dst1 using the mask
    //3.Invert your mask and copy destination image to a new Mat dst2
    //4.For final result just add up dest1 and dest2 to new Mat
    Mat src = imread("src.jpg",1);
    Mat dst = imread("dest.bmp",1);


    int new_w = 0;
    int new_h = 0;
    if(src.cols >dst.cols)
    new_w = dst.cols;
    else
    new_w = src.cols;


    if(src.rows>dst.rows)
    new_h=dst.rows;
    else
    new_h=src.rows;
    Rect rectROI(0,0,new_w,new_h);
    Mat mask(new_h, new_w, CV_8UC1, cv::Scalar(0));


    Point P1(107,41);
    Point P2(300,61);
    Point P3(250,280);
    Point P4(110,253);
    vector< vector<Point> >  co_ordinates;
    co_ordinates.push_back(vector<Point>());


    co_ordinates[0].push_back(P1);
    co_ordinates[0].push_back(P2);
    co_ordinates[0].push_back(P3);
    co_ordinates[0].push_back(P4);
    drawContours( mask,co_ordinates,0, Scalar(255),CV_FILLED, 8 );


    Mat srcROI=src(rectROI);
    Mat dstROI=dst(rectROI);
    Mat dst1;
    Mat dst2;


    srcROI.copyTo(dst1,mask);
    imwrite("dst1.jpg",dst1);


    bitwise_not(mask,mask);
    dstROI.copyTo(dst2,mask);


    dstROI.setTo(0);
    dstROI=dst1+dst2;

    imshow("final result",dst);

    result:


    展开全文
  • 做毕设的时候老师要求选取任意roi区域,决定用qt的鼠标事件存点同时用paintevent画出两点连线。并用opencv来在掩膜mask上画出边界再提取roi;** 实现效果如下: 主界面:点击open 选取照片(这个照片是吴龙备注...
  • opencv 设置任意形状ROI的各种方法

    千次阅读 2017-11-10 21:36:18
    按本方法设置的任意形状ROI区域,不能带有修改的关联性,具体看代码。能有关联性的设置方法还没找到。。 #include "stdafx.h" #include int main() { std::string imageName("C:\\Users\\dept2-1\\Pictures\...
  • openCV任意几何形状感兴趣区域(ROI)提取

    万次阅读 多人点赞 2016-11-07 21:04:03
    图像感兴趣区域(ROI)提取主要...方法一 使用opencv中Mat函数方法,调用Mat(Rect).setTo方法设置掩模 Mat Mat::operator()( const Rect&amp;amp;amp;amp; roi ) const //调用Mat(Rect).setTo方法 mask(rect).
  • 转载:http://blog.csdn.net/wangyaninglm/article/details/43853435
  • 程序还不完善 #include <...opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace cv; using namespace std...
  • 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 ...一、ROI是什么?...二、多边形ROI处理思路 ...ROI是图像中的一个概念,叫做感兴趣区域,是对图像局部区域操作的手
  • OpenCV入门:ROI感兴趣区域(鼠标事件选定区域) ...
  • 在利用OpenCV对图像进行处理时,通常会遇到一个情况,就是只需要对部分感兴趣区域进行处理。 因此,如何选取感兴趣区域(其实就是“抠图”)。 下面给出一个例子: Mat img = imread(IMG_PATH); Mat cat = imread...
  • opencv使用—使用鼠标任意形状的抠图 项目中使用到opencv提取多边形,并做成mask opencv4.1.0 #include <iostream> #include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" #...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 818
精华内容 327
关键字:

opencv任意形状roi