2014-11-07 4 views
0

Я пытаюсь использовать систему cli/C++/многопоточность для программного обеспечения обнаружения opencv, которое у меня есть. У меня есть несколько haarcascades, которые я хочу использовать в нескольких потоках, чтобы работать одновременно. Я стараюсь следовать инструкциям от here:. Я заметил, что когда я создаю класс ref, я не могу определить объекты opencv класса. Например, когда я пытаюсь определить приватные переменные для моей реф обнаружения класса:C++ - смешанные типы cli не поддерживаются

private: 
    Mat *image; 
    CascadeClassifier *cascade; 
    double scale; 
    int neighbors; 
public: 
    Detection(cv::Mat &img, cv::CascadeClassifier &cas, double sc, int neigh) 
    { 
     image = new cv::Mat(img); 
     cascade = new cv::CascadeClassifier(cas); 
     scale = sc; 
     neighbors = neigh;  
    } 
    void detect_faces(){ 

    Mat gray_image; 
    cv::cvtColor((*image), gray_image, CV_BGR2GRAY); 
    cv::equalizeHist(gray_image, gray_image); 
    std::vector<cv::Rect> faces1; 
    (*cascade).detectMultiScale(gray_image, faces1, scale, neighbors, 0| CASCADE_SCALE_IMAGE, Size(3, 3), Size(190,190)); 
    faces.insert(faces.end(), faces1.begin(), faces1.end()); 
} 

Основная функция:

int main() 
{ 
    Mat image = imread(...); 
    cv::CascadeClassifier face_cascade1; 
    face_cascade1.load("cascades/lbpcascade_profileface.xml"); 
    Detection^ obj1 = gcnew Detection(image, face_cascade1, 1.01,5); 
    ThreadStart^ myThreadDelegate1 = gcnew ThreadStart(obj1, &Detection::detect_faces); 
    Thread^ Thread1 = gcnew Thread(myThreadDelegate1); 

    Thread1->start(); 
    ...//the rest threads 
    } 

Этот код, кажется, работает. Однако, как сказал Берак, я не должен делать копию cascadeClassifier. Есть ли что-то еще, что я мог бы сделать? Есть ли проблема потерять время с этой реализацией? Кроме того, есть возможность переместить detectMultiScale в основную функцию?

+0

Это только верх айсберга. честно говоря, управляемые C++ и opencv не идут хорошо вместе. если вы хотите член класса, вам придется использовать 'CascadeClassifier * cascade' (указатель, новый и удалить ..). также, знаете, что эти CascadeClassifiers * не * потокобезопасны. (внутреннее состояние не позволяет обмениваться одним каскадом между несколькими потоками). пожалуйста, подумайте о своем дизайне. вы * действительно * нуждаетесь в управлении C++? – berak

+0

К сожалению, да. Я хочу иметь 7 различных каскадов, работающих одновременно. Я хочу запускать каждый новый поток с различным каскадом. –

+0

ну, по одному в потоке было бы нормально (как только вы получите указатели вправо ...) – berak

ответ

3

Классы ссылок C++/CLI могут содержать только объекты .Net или примитивные типы в качестве членов.
Если вы хотите иметь член C++, вам придется удерживать указатель на него. (Который может быть скомпилирован для целочисленного типа, достаточно большого для удержания указателя).

Теперь, если вы хотите проверить, если потоки работают одновременно, вы можете сделать 2 вещи:

  1. приостановить программу и посмотреть на окнах ниток. (Debug -> Windows -> Threads)
    Здесь вы можете увидеть все рабочие потоки, но вам может быть не повезло и «пропустить» время, которое показывает, что оба потока работают.

  2. Добавить длинный sleep() в каждой теме. как раз перед началом работы. Затем приостановите программу, как в (1), и если вы видите потоки, ожидающие на sleep(), значит, они работают одновременно.

+0

Я проверил и потоки одновременно. Однако я использую код в Edit2. Берак предлагает не копировать каскадный классификатор cascade = new cv :: CascadeClassifier (cas) ;. Однако эта реализация работает. Что можно здесь изменить? –

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