我想将这些相邻的白色像素分组,并使用C++在OpenCV中围绕它们绘制一个矩形.
原始图片:
预期结果:
我是OpenCV的新手.任何帮助将深表感谢.
您可以使用分区根据给定谓词对白色像素进行分组.在这种情况下,您的谓词可以是:对给定欧几里德距离内的所有白色像素进行分组.
然后,您可以计算每个组的边界框,保留最大的框(在下面的RED中),并最终放大它(在下面的绿色中):
码:
#include#include #include using namespace std; using namespace cv; int main() { // Load the image Mat3b img = imread("path_to_image", IMREAD_COLOR); // Convert to grayscale Mat1b gray; cvtColor(img, gray, COLOR_BGR2GRAY); // Get binary mask (remove jpeg artifacts) gray = gray > 200; // Get all non black points vector pts; findNonZero(gray, pts); // Define the radius tolerance int th_distance = 50; // radius tolerance // Apply partition // All pixels within the radius tolerance distance will belong to the same class (same label) vector labels; // With lambda function (require C++11) int th2 = th_distance * th_distance; int n_labels = partition(pts, labels, [th2](const Point& lhs, const Point& rhs) { return ((lhs.x - rhs.x)*(lhs.x - rhs.x) + (lhs.y - rhs.y)*(lhs.y - rhs.y)) < th2; }); // You can save all points in the same class in a vector (one for each class), just like findContours vector > contours(n_labels); for (int i = 0; i < pts.size(); ++i) { contours[labels[i]].push_back(pts[i]); } // Get bounding boxes vector boxes; for (int i = 0; i < contours.size(); ++i) { Rect box = boundingRect(contours[i]); boxes.push_back(box); } // Get largest bounding box Rect largest_box = *max_element(boxes.begin(), boxes.end(), [](const Rect& lhs, const Rect& rhs) { return lhs.area() < rhs.area(); }); // Draw largest bounding box in RED Mat3b res = img.clone(); rectangle(res, largest_box, Scalar(0, 0, 255)); // Draw enlarged BOX in GREEN Rect enlarged_box = largest_box + Size(20,20); enlarged_box -= Point(10,10); rectangle(res, enlarged_box, Scalar(0, 255, 0)); imshow("Result", res); waitKey(); return 0; }