2015-02-24 4 views
0

Эй У меня есть простой поток на Windows:синтаксического анализа OpenCV рамка между нитями

while (!MainThreadHasFinished) { 
    cv::Mat frame = (cv::Mat)lpParameter;  //Casting try. 
    cv::imshow("Camera image", (frame));  //Show Img in window 
    printf("img printed");      //print text to cmd 

    if (cv::waitKey(1) == 27)     // exit this loop when ESC was pressed 
     break; 
    } 
    return 0; 
} 

Если проблема в том, что я не могу сделать cv::imshow, это не похоже, что это отливка сорта :: Mat :)

Я создаю нить, как:

DWORD thread_ID; 
HANDLE handle_NumberCruncher = CreateThread( 
    NULL,     // default security attributes 
    0,      // use default stack size 
    NumberCruncher,   // thread function name 
    &frame,     // argument to thread function 
    0,      // use default creation flags 
    &thread_ID);   // returns the thread identifier 

Я видел несколько ссылок на кастинг на MSDN и стеком, но ничего для этого изображения.

Если это невозможно, тогда вопрос в целом заключается в том, как анализировать данные между потоками. Там, где идея состоит в том, что некоторая обработка изображения может быть выполнена в основном потоке, а затем анализируется на более продвинутый материал, не необходимый для каждого изображения. Без использования глобальных переменных. Поскольку поток может быть на другом процессоре, как пример :)

+1

нитки без замков - pheww. – berak

ответ

1

lpParameter является указателем void*. Вы должны привести его к cv::Mat типу указателя первого, то есть:

DWORD WINAPI NumberCruncher(LPVOID lpParameter) 
{ 
    while (!MainThreadHasFinished) { 
     cv::Mat* frame = (cv::Mat*)lpParameter;  //Casting try. 
     printf("img printed");      //print text to cmd 

     // Display image in the main thread 
     // ... 

     Sleep(1); 
    } 
    return 0; 
} 

DWORD thread_ID; 
HANDLE handle_NumberCruncher = CreateThread( 
    NULL,     // default security attributes 
    0,      // use default stack size 
    NumberCruncher,   // thread function name 
    &frame,     // argument to thread function 
    0,      // use default creation flags 
    &thread_ID);   // returns the thread identifier 

Или, если поток не нужен доступ к исходной переменной:

cv::Mat value = *(cv::Mat*)lpParameter;


PS: GUI системы обычно позволяют отображать на экране информацию и вводить пользовательский ввод в основной поток. Попробуйте использовать imshow & waitkey из основной темы.

+0

ahh damn-it Я попробовал то, что вы предложили, но получив следующую ошибку: Необработанное исключение в 0x7648C42D в opencvTest.exe: исключение Microsoft C++: cv :: Исключение в ячейке памяти 0x0588FAF4. Это происходит, когда 'cv :: imshow' называется – JTIM

+0

. GUI-системы обычно позволяют отображать на экране информацию и вводить пользовательский ввод в основной поток. Попробуйте просто использовать 'imshow' &' waitKey' из основного потока. – Kornel

+0

Это хорошо работает. Я протестировал ваше представление о том, что основной поток должен иметь приложение GUI. Но я могу сделать 'cv :: Mat output = cv :: Mat :: zeros (120, 350, CV_8UC3); \t \t putText (вывод «Hello World :)», cvPoint (15, 70), cv :: FONT_HERSHEY_PLAIN, 3, cvScalar (0, 255, 0), 4); \t \t imshow («Output», output); 'что подразумевает, что исходный код должен работать, если' frame' был передан правильно или? – JTIM

Смежные вопросы