判断opencv自定义多边形内是否含有某个点
#ifndef BOXEXTRACTOR_H
#define BOXEXTRACTOR_H
#include <opencv2/opencv.hpp>
#include <fstream>
#include <iostream>
using namespace std;
class MouseHelper4OpenCV {
public:
MouseHelper4OpenCV();
bool checkPointInPolygon(cv::Point point);
vector<vector<cv::Point>> contours;
vector<cv::Vec4i> hierarchy;
cv::Mat MouseDraw(const std::string& windowName, cv::Mat img);
struct handlerT{
bool isDrawing;
cv::Point curPoint;
cv::Mat image;
std::vector<cv::Point2f> vert;
handlerT(): isDrawing(false) {};
}params;
private:
static void mouseHandler(int event, int x, int y, int flags, void *param);
void opencv_mouse_callback( int event, int x, int y, int , void *param );
};
#endif // BOXEXTRACTOR_H
#include "mousedraw.h"
MouseHelper4OpenCV::MouseHelper4OpenCV()
{
}
bool MouseHelper4OpenCV::checkPointInPolygon(cv::Point point)
{
for(size_t i = 0; i<contours.size(); i++)
{
if (cv::pointPolygonTest(contours[i], point, false) > 0)return true;
}
return false;
}
void MouseHelper4OpenCV::mouseHandler(int event, int x, int y, int flags, void *param){
MouseHelper4OpenCV *self =static_cast<MouseHelper4OpenCV*>(param);
self->opencv_mouse_callback(event,x,y,flags,param);
}
void MouseHelper4OpenCV::opencv_mouse_callback( int event, int x, int y, int , void *param ){
handlerT * data = (handlerT*)param;
switch( event ){
case cv::EVENT_MOUSEMOVE:
break;
case cv::EVENT_LBUTTONDOWN:
data->isDrawing = true;
break;
case cv::EVENT_LBUTTONUP:
data->isDrawing = false;
data->curPoint.x = x;
data->curPoint.y = y;
data->vert.push_back (data->curPoint);
break;
}
}
cv::Mat MouseHelper4OpenCV::MouseDraw(const std::string& windowName, cv::Mat img){
int key=0;
cv::imshow(windowName,img);
printf("DRAW AN DIGIT and then press SPACE/BACKSPACE/ENTER button!\n");
params.image=img.clone();
cv::setMouseCallback( windowName, mouseHandler, (void *)¶ms );
while(!(key==32 || key==27 || key==13)){
for( int j = 0; j < params.vert.size (); j++ )
{
cv::circle ( params.image, params.vert[j],2, cv::Scalar( 255 ), 3, 8 );
}
cv::imshow(windowName,params.image);
key=cv::waitKey(1);
}
cv::Mat src = cv::Mat::zeros( cv::Size(params.image.cols, params.image.rows ),CV_8UC1 );
for( int j = 0; j < params.vert.size (); j++ )
{
cv::line( src, params.vert[j], params.vert[(j+1)%params.vert.size ()], cv::Scalar( 255 ), 4, 8 );
cv::line( params.image, params.vert[j], params.vert[(j+1)%params.vert.size ()], cv::Scalar( 255 ), 4, 8 );
}
cv::findContours(src,contours,hierarchy,cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE);
return params.image;
}
/**
* @function pointPolygonTest_demo.cpp
* @brief Demo code to use the pointPolygonTest function...fairly easy
* @author OpenCV team
*/
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include "mousedraw.h"
using namespace cv;
using namespace std;
/**
* @function main
*/
int main( void )
{
MouseHelper4OpenCV helper;
helper.MouseDraw ("test",imread("d://0000.jpg"));
if(helper.checkPointInPolygon (cv::Point(100,100))){
printf("!!!!! in !!!!!\n");
}else{
printf("!!!!! not in !!!!!\n");
}
printf("Done\n");
return(0);
}