Я уже добавил две трекбары, отвечающие за изменение самого низкого и максимально возможного порогового уровня в алгоритме обнаружения краев Кэнни.Более того, я бы хотел, чтобы он мог читать другие изображения в цикле и корректировать для них пороговые уровни.
Вот код (без функции определения края, это просто оттенки серого-> размытие-> 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 ().Есть ли лучший способ?Или как я могу использовать стрелку вправо для движения вперед и налево для возврата?
Заранее спасибо!