c++ - 在没有固定角度的图像上绘制旋转边界框

标签 c++ opencv bounding-box

我是编程和 opencv 的新手,我尝试使用颜色分割来检测硬盘。到目前为止,我的代码加载了一张图片,创建了 3 个不同颜色的蒙版,并在非零点周围绘制了一个直立的边界框:

int main( int argc, char** argv )
{

//Load the image
Mat img = imread(argv[1], 1);
if (img.empty()){
cout << "No image found..." << endl;
return -1;
}

//Extracting colors - BGR
Mat silver, white, black;

//Silver
inRange(img, Scalar(180, 180, 180), Scalar(200, 200, 200), silver);

//White
inRange(img, Scalar(240, 240, 240), Scalar(255, 255, 255), white);

//Black
inRange(img, Scalar(0, 0, 0), Scalar(30, 30, 30), black);

// logical OR mask
Mat1b mask = silver | white | black;

// Find non zero pixels
vector<Point> pts;

findNonZero(mask, pts);

cout << "Non-Zero Locations = " << pts << endl << endl; // get non zero coordinates

// Compute bounding box

Rect box = boundingRect(pts);

// Show bounding box
rectangle(img, box, Scalar(0, 0, 255), 3);
namedWindow("box", CV_WINDOW_NORMAL);
imshow("box", img); 
imshow("mask", mask);

waitKey(0);
destroyAllWindows;

return 0;}

现在我想画最小的边界框,所以我尝试使用

cv::RotatedRect box2 = cv::minAreaRect(pts);

相反。但是当我尝试通过替换

来可视化它时,它不会编译
Rect box = boundingRect(pts); 

RotatedRect box2 = minAreaRect(pts);

错误输出:

error: no matching function for call to ‘rectangle(cv::Mat&, cv::RotatedRect&, cv::Scalar, int)’
 rectangle(img, box2, Scalar(0, 0, 255), 3);

最佳答案

根据 cv::Rectangle Opencv Docs ,该函数只有 2 个变体:

void rectangle(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)

void rectangle(Mat& img, Rect rec, const Scalar& color, int thickness=1, int lineType=8, int shift=0 )

很明显它只接受cv::Rectcv::Point。因此,没有直接输入 cv::RotatedRect 的规定,因此您会收到上述错误。

要解决此问题,您可以使用以下方法提取 cv::RotatedRect 的 4 个点:

cv::Point2f points[4];
rotatedRect.points(points);

然后使用 cv::line() 成对地绘制边缘:

cv::RotatedRect rotatedRect = cv::RotatedRect(cv::Point(70, 70), cv::Size(90, 90), 30);

cv::Mat canvas = cv::Mat(200, 200, CV_8UC3, cv::Scalar(255, 255, 255));

cv::Point2f points[4];
rotatedRect.points(points);

cv::line(canvas, points[0], points[1], cv::Scalar(0, 255, 0), 3);
cv::line(canvas, points[1], points[2], cv::Scalar(0, 255, 0), 3);
cv::line(canvas, points[2], points[3], cv::Scalar(0, 255, 0), 3);
cv::line(canvas, points[3], points[0], cv::Scalar(0, 255, 0), 3);

enter image description here

关于c++ - 在没有固定角度的图像上绘制旋转边界框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47053535/

相关文章:

c++ - vs2008 c++用键盘拖动调试器的箭头

c++ - 了解 C++ 标准的 move 语义

c++ - 如何使用 C++ 清除 OpenCV 中的白色背景?

c++ - camShift 和 cvCamShift 有什么区别?

math - 如何在矩形的周长中找到与给定点最近的点?

c++ - 连接 qradiobutton 和 qtab 小部件时出现问题

c++: OpenCV cv::Mat::at 无法分配给常量变量

python - 边界框内的 numpy 过滤点

image-processing - 使用 MATLAB 对图像进行边界框

c++ - 在不使用数据库的情况下在进程之间共享设置?