【发布时间】:2018-04-13 16:37:16
【问题描述】:
我是编程和 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);
【问题讨论】:
-
什么是堆栈跟踪?卡在哪里了?
-
你是这个意思吗?编辑帖子是否正确,或者我应该在 cmets 中进行更改?抱歉,感谢您的快速回复!
-
你是什么意思“它崩溃了”,它甚至没有编译,因为没有这样的过载——阅读docs!并参考existing tutorials——即使那个使用Python,你可以看到要绘制一个旋转的矩形,他们使用
boxPoints,然后使用drawContours渲染结果。你为什么不尝试同样的方法?
标签: c++ opencv bounding-box