opencv只操作不规则多边形roi

代码展示

/*
*【1】得到不规则多边形的roi:
*                     void get_multi_roi_invade(Mat& img,vectorpt_vector);//得到不规则多边形roi的区域
*【2】从文件中读取不规则多边形roi的各个顶点坐标:
*【3】得到roi,只对roi区域进行操作
*/

#include 
#include 
#include 
#include 
using namespace std;
using namespace cv;

vector pt_vector;
///////得到不规则多变形ROI的函数
void get_multi_roi_invade(Mat& img,vectorpt_vector);//////得到不规则多边形roi的区域
int main()
{
    /////////////*********************从文件中得到不规则多边形roi的各个顶点坐标  start
    ifstream in_file;
    in_file.open("entrance.txt");/////打开文件
    if(!in_file.is_open())/////判断文件是否打开
    {
        cout<<"in_file is not opened!"<string str_temp;
    while(!in_file.eof())//////从文件中获取顶点信息,存储到向量pt_vector中
    {
        in_file>>pt_temp.x>>pt_temp.y;
        cout<<"横坐标:"<"纵坐标:"<///////为了避免最后一行读取两遍
        in_file.get();
        if(in_file.peek() == '\n')
            break;
    }
    in_file.close();//////关闭文件
    /////////////*********************从文件中得到不规则多边形roi的各个顶点坐标  end

    //////制作模板
    Mat ROI_MASK(240,432,CV_8UC3,Scalar::all(255));
    get_multi_roi_invade(ROI_MASK,pt_vector);//////得到不规则多边形roi区域
    imshow("ROI_MASK",ROI_MASK);


    VideoCapture cap;
    cap.open(0);
    if(!cap.isOpened())
        return -1;
    while(1)
    {
        Mat src;
        cap>>src;
        resize(src,src,Size(432,240));
        //get_multi_roi_invade(src,pt_vector);//得到入侵检测的区域
        bitwise_and(src,ROI_MASK,src);
        //////////////只对roi的区域操作  start 
        /////只对roi的区域操作......

        //////////////只对roi的区域操作   end 
        /////显示在roi上的处理结果
        imshow("roi",src);
        waitKey(1);
    }

    return 0;
}

void get_multi_roi_invade(
    Mat& img,//////既是输入也是输出
    vectorpt_vector//////不规则多边形ROI的各个顶点坐标的集合
    )
{
    /////////得到 上部分的左右两点
    Point pt_bl = Point(0,pt_vector[0].y);
    Point pt_br = Point(img.cols,pt_vector[1].y);
    //cout<

    ////////****************所选区域的上部分  start
    Point **root_points = new Point* [1];
    root_points[0] = new Point[6];
    ///////对二维数组赋值  得到上部分区域的顶点
    root_points[0][0] = pt_vector[0];
    root_points[0][1] = pt_vector[1];
    root_points[0][2] = pt_br;
    root_points[0][3] = Point(img.cols,0);
    root_points[0][4] = Point(0,0);
    root_points[0][5] = pt_bl;
    const Point* ppt[1] = {root_points[0]};  
    int npt[] = {6};  
    polylines(img, ppt, npt, 1, 1, Scalar(255),1,8,0);  
    ///////对上部分区域的像素点赋值为0
    fillPoly(img, ppt, npt, 1, Scalar(0,0,0));  
    //imshow("【上部分】",img);/经测试  上面的程序起到了作用
    ////////****************所选区域的上部分  end



    ///////////*********所选区域下部分    start
    ///////创建下方区域的顶点二维数组
    const int i_size = pt_vector.size();
    Point **root_points_1 = new Point* [1];
    root_points_1[0] = new Point [i_size+4];

    ////////得到下方区域的顶点
    int i;
    for(i = 1; i < i_size;i++)
    {
        root_points_1[0][i-1] = pt_vector[i];
    }
    //cout<<"i= "<
    root_points_1[0][i-1] = pt_vector[0];
    root_points_1[0][i++] = pt_bl;
    root_points_1[0][i++] = Point(0,img.rows);
    root_points_1[0][i++] = Point(img.cols,img.rows);
    root_points_1[0][i++] = pt_br;

    const Point* ppt_1[1] = {root_points_1[0]};  
    int npt_1[] = {i_size+4};  
    polylines(img, ppt_1, npt_1, 1, 1, Scalar(255),1,8,0);  
    ////////画下方的区域
    fillPoly(img, ppt_1, npt_1, 1, Scalar(0,0,0));  
    ///////////*********所选区域下部分    end
}


结果展示

opencv只操作不规则多边形roi_第1张图片

你可能感兴趣的:(opencv,图像处理,opencv,不规则多边形roi)