如何使用OpenCV从点获取轮廓

如何使用OpenCV从点获取轮廓,opencv,line,points,contour,roi,Opencv,Line,Points,Contour,Roi,我正在尝试使用VC++和OpenCV从图像中获取ROI。 我设法显示了一幅图像,当我点击它时,得到了一个点的坐标,将这些坐标存储在一个向量中,并在图像上的这些点之间画线。 这是我的密码: //Includes #include <iostream> #include <cstdio> #include <cstdlib> #include <stdio.h> #include <opencv2/highgui/highgui.hpp>

我正在尝试使用VC++和OpenCV从图像中获取ROI。 我设法显示了一幅图像,当我点击它时,得到了一个点的坐标,将这些坐标存储在一个向量中,并在图像上的这些点之间画线。 这是我的密码:

//Includes
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <stdio.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;

static int app;
static vector<Point2f> cont(6);
static Mat img = imread("C:/img.jpg",0);

void on_mouse(int, int, int, int, void* );

int main() 

{
app = 0;
namedWindow("myWindow", CV_WINDOW_AUTOSIZE);
cvSetMouseCallback("myWindow", on_mouse, 0);
imshow("myWindow", img);
waitKey(0);
}

void on_mouse(int evt, int x, int y, int flags, void* param)
{

if(evt == CV_EVENT_LBUTTONDOWN)
{
    Point pt(x,y);
    if(app<6)
        {
            cont[app]=pt;
            app++;
        }


    cout<<"Coordonnees du point pt : "<<x<<","<<y<<endl;
    for (int i=0; i<6;i++)
    {cout<<cont[i]<<endl;}
}
 if(evt == CV_EVENT_RBUTTONDOWN)
{
    for (int j=0;j<5;j++)
        {
            line(img,cont[(j)],cont[(j+1)],CV_RGB(255,0,0),2);
        }
    line(img,cont[(5)],cont[(0)],CV_RGB(255,0,0),2);
    imshow("myWindow", img);

    }
}
//包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
静态int-app;
静态矢量控制(6);
静态材料img=imread(“C:/img.jpg”,0);
鼠标上的空格(int,int,int,int,int,void*);
int main()
{
app=0;
namedWindow(“myWindow”,CV\u WINDOW\u AUTOSIZE);
cvSetMouseCallback(“myWindow”,在鼠标上,0);
imshow(“我的窗口”,img);
等待键(0);
}
鼠标上的void(int-evt、int-x、int-y、int-flags、void*param)
{
如果(evt==CV_事件_LBUTTONDOWN)
{
点pt(x,y);

如果(app生成单个元素
向量
,然后使用填充了CV的drawContours。那么您将获得所需的二进制矩阵

我目前没有IDE,但代码如下

vector< vector< Point> > contours;
contours.push_back(cont);//your cont
Mat output(img.rows,img.cols,CV_8UC1);//your img
drawContours(output, contours, 0, Scalar(1), CV_FILLED);//now you have binary image
vector>等高线;
轮廓。向后推(cont);//你的cont
Mat输出(img.rows、img.cols、CV_8UC1);//您的img
drawContours(输出,轮廓,0,标量(1),CV_填充);//现在有了二进制图像

你对轮廓所有点的坐标的目标是什么?为什么你需要它们,因为你有所有的角点和所有其他的线点?谢谢Thomas,这似乎正是我需要的,但我可以做到。是轮廓吗(在你的例子中)点数组?我在OpenCV文档中读到,参数轮廓必须是CvSeq*类型,但我不知道如何从我的点数组创建这样一个对象