Я довольно новичок в openCV, и это мой первый проект, поэтому мне нужны некоторые предложения. Я пытаюсь найти размерность различных объектов. Я написал некоторый код, основанный на учебных пособиях на opencv.org и на примерах по изучению книги openCV Брадски & Келерово.
До сих пор я работал с одним объектом. Когда я попытался найти измерение другого объекта, я понял, что мне нужно изменить пороговое значение Canny.
Итак, мой вопрос: как я могу заставить мою программу автоматически выполнять такие настройки для разных объектов? Так что мне не нужно ничего менять вручную. Какой алгоритм я должен использовать?
Фон будет таким же, положение камеры будет фиксированным, можно предположить, что освещение будет таким же.
Для этой картины мне нужно значение threshold1 53, чтобы найти ребра.
Для этого значение 141 работает довольно хорошо.
Я не смог найти никаких значений для этого, так как его цвет почти такой же, как цвет фона.
Вот мой код:
#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
using namespace std;
Mat src, src_gray, src_blur;
Mat canny_output;
int canny_thresh = 53;
int canny_max_thresh = 200;
int canny_kernel = 3;
int canny_ratio = 3;
bool L2gradient = true;
char* source_window = "Source";
char* canny_window = "Canny";
char* contour_window = "Contours";
/** @function main */
int main(int argc, char** argv)
{
/// Load source image and convert it to gray
src = imread("bluePaper2.png", 1);
/// Create Window
namedWindow(source_window, CV_WINDOW_AUTOSIZE);
imshow(source_window, src);
/// Convert image to gray and blur it
cvtColor(src, src_gray, CV_BGR2GRAY);
/// Reduce noise with a kernel 3x3
blur(src_gray, src_blur, Size(3, 3));
/// Detect edges using Canny
Canny(src_blur, canny_output, canny_thresh, canny_thresh * canny_ratio, canny_kernel, L2gradient);
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
/// Find contours
findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
/// Find the rotated rectangles and ellipses for each contour
vector<RotatedRect> minRect(contours.size());
vector<RotatedRect> minEllipse(contours.size());
for (int i = 0; i < contours.size(); i++)
{
minRect[i] = minAreaRect(Mat(contours[i]));
if (contours[i].size() > 5)
{
minEllipse[i] = fitEllipse(Mat(contours[i]));
}
}
/// Draw contours + rotated rects + ellipses
Mat drawing = Mat::zeros(canny_output.size(), CV_8UC3);
for (int i = 0; i< contours.size(); i++)
{
// contour
drawContours(drawing, contours, i, Scalar(255, 255, 0), 2, 8, vector<Vec4i>(), 0, Point());
// ellipse
ellipse(drawing, minEllipse[i], Scalar(0, 0, 255), 2, 8);
// rotated rectangle
Point2f rect_points[4]; minRect[i].points(rect_points);
for (int j = 0; j < 4; j++)
line(drawing, rect_points[j], rect_points[(j + 1) % 4], Scalar(0, 255, 0), 2, 8);
}
/// Show in a window
namedWindow(canny_window, CV_WINDOW_AUTOSIZE);
namedWindow(contour_window, CV_WINDOW_AUTOSIZE);
imshow(canny_window, canny_output);
imshow(contour_window, drawing);
waitKey(0);
return(0);
}
Заранее спасибо.
Задача ещё не решена.