我正在尝试将cli / c ++系统/多线程用于我的opencv检测软件。我有几个haarcascades,我想在几个线程中使用它们,以便同时运行。我正在尝试按照here:的说明进行操作。我注意到,当我创建ref类时,我无法将其定义为类成员opencv对象。例如,当我尝试为我的ref类定义私有变量时检测:
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
}
这段代码似乎有效。但是,正如Berak所说,我不应该制作cascadeClassifier的副本。我还能做些什么吗?是否存在因实施而浪费时间的问题?还有机会在main函数中移动detectMultiScale吗?
答案 0 :(得分:3)
C ++ / CLI ref类只能将.Net对象或原始类型作为成员保存 如果你想拥有一个C ++成员,你必须拥有一个指向它的指针。 (可以将其编译为足以容纳指针的整数类型。)
现在,如果你想检查线程是否同时运行,你可以做两件事:
暂停程序,查看线程窗口。 (调试 - &gt; Windows - &gt;主题)
在这里你可以看到所有工作线程,但你可能不走运,并且&#34;想念&#34;显示两个线程都在工作的时间。
在每个帖子中添加一个长sleep()
。就在开始工作之前。然后像(1)中那样暂停程序,如果你看到线程在sleep()
上等待,那么这意味着它们会同时工作。