Изменение порога в цикле

Я уже добавил две трекбары, отвечающие за изменение самого низкого и максимально возможного порогового уровня в алгоритме обнаружения краев Canny. Более того, я бы хотел, чтобы он мог читать другие картинки в цикле и настраивать для них пороговые уровни.

Вот код (без функции определения ребер, это просто оттенки серого-> размытие-> Размытие-> размытие-> отрисовка краев-> подгонка к наименьшему прямоугольнику):

https://pastebin.com/cmh8GUvh

struct  Thresh
{
double thMin = 0;
double thMax = 255;
double resolution = 1;
int minTbV = 0;
int maxTbV = 0;

double Range()
{return thMax - thMin;}

int Ticks()
{return cvRound(Range()/resolution);};

double minValue()
{return thMin + minTbV * Range() / Ticks();}

double maxValue()
{return thMin + maxTbV * Range() / Ticks();}

//int tbValue = cvRound(Ticks() / 2.0); // start at 50%
};

void onTrackBar(int, void* userData)
{
Thresh *pdata = (Thresh*)userData;

double minTh = pdata->minValue();
double maxTh = pdata->maxValue();

std::cout << "MIN threshold:" << minTh << endl;
std::cout << "MAX threshold:" << maxTh << endl;
}

Mat open_images(int i)
{
string fullfileName;
stringstream ss;
Mat image;

ss << "C:/Users/Filip/Desktop/DATA/test" << i << ".jpg" << endl;
ss >> fullfileName;
image = cv::imread(fullfileName, 1);
return image;
}void changing_thresh()
{
Thresh data;
static const char * winName = "MyWindow";
Mat IMAGE = cv::imread("C:/Users/Filip/Desktop/Frame.jpg", 1);
Mat img;
int i = 1;

while (1)
{
if (waitKey(30) == 27)
{
i++;
IMAGE = open_images(i);
}
cv::namedWindow(winName);
cv::createTrackbar("MinThresh", winName, &(data.minTbV),
data.Ticks(), onTrackBar, &data);
cv::createTrackbar("MaxThresh", winName, &(data.maxTbV),
data.Ticks(), onTrackBar, &data);
onTrackBar(0, &data);
img = edgedetect(IMAGE, data.minTbV, data.maxTbV);
imshow("MyWindow", img);
char c = (char)waitKey(25);
}
cv::waitKey(1);
}int main()
{
changing_thresh();
waitKey();
}

К сожалению, я столкнулся с двумя препятствиями:

1) (строки 57 — 72) Является ли цикл while единственным способом передачи изменяющихся значений data.minTbV / data.maxTbV в трекбар?

2) Я изменяю изображения, нажимая ESC (строка 59), но на самом деле это не работает должным образом из-за времени, установленного внутри waitKey (). Есть ли лучший способ? Или как я могу использовать стрелку вправо для движения вперед и налево для возвращения?

Заранее спасибо!

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]