Изменение порога в цикле - PullRequest
0 голосов
/ 01 декабря 2018

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

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

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 ().Есть ли лучший способ?Или как я могу использовать стрелку вправо для движения вперед и налево для возврата?

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

...