2015-05-13 2 views

ответ

0

Я нашел решение.

A) Определить четыре точки трапеции как контур:

std::vector<std::vector<cv::Point> > MakeRotatedTrapeze(
    const cv::Size& BBSize, 
    const float& angleRad, 
    const cv::Point2f& trapezeCenter, 
    const float& topToBottomRatio) 
{ 
    //Make trapeze 
    cv::Point2f deltaDOWN(BBSize.height/2*sin(angleRad), BBSize.height/2*cos(angleRad));//bottom 
    cv::Point2f deltaUP = -deltaDOWN;//top 
    cv::Point2f deltaLEFT(-BBSize.width/2*cos(angleRad), BBSize.width/2*sin(angleRad));//left 
    cv::Point2f deltaRIGHT = -deltaLEFT;//right 

    cv::Point2f bl = trapezeCenter + deltaDOWN + deltaLEFT; 
    cv::Point2f br = trapezeCenter + deltaDOWN + deltaRIGHT; 
    cv::Point2f tl = trapezeCenter + deltaUP + topToBottomRatio*deltaLEFT; 
    cv::Point2f tr = trapezeCenter + deltaUP + topToBottomRatio*deltaRIGHT; 

    cv::Point trapez_pts[4] = {tl, tr, br, bl}; 
    vector<vector<Point> > trapeze(1, vector<Point>(trapez_pts, trapez_pts + 4)); 

    return trapeze; 
} 

B) Постройте трапецию с помощью drawContours

float trapezTopScale = 0.5; 
std::vector<std::vector<cv::Point> > trapeze = MakeRotatedTrapeze(cv::Size(100, 50), 45.0, cv::Point2f(320, 240), trapezTopScale); 
cv::Mat image(480, 640, CV_8UC1); 
image.setTo(0); 
drawContours(image, trapeze, 0, cv::Scalar(255), CV_FILLED, 8, vector<Vec4i>()); 
Смежные вопросы