Я пытаюсь использовать систему 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 в основную функцию?
Это только верх айсберга. честно говоря, управляемые C++ и opencv не идут хорошо вместе. если вы хотите член класса, вам придется использовать 'CascadeClassifier * cascade' (указатель, новый и удалить ..). также, знаете, что эти CascadeClassifiers * не * потокобезопасны. (внутреннее состояние не позволяет обмениваться одним каскадом между несколькими потоками). пожалуйста, подумайте о своем дизайне. вы * действительно * нуждаетесь в управлении C++? – berak
К сожалению, да. Я хочу иметь 7 различных каскадов, работающих одновременно. Я хочу запускать каждый новый поток с различным каскадом. –
ну, по одному в потоке было бы нормально (как только вы получите указатели вправо ...) – berak