不支持C ++ - cli混合类型

时间:2014-11-07 09:01:51

标签: opencv c++-cli

我正在尝试将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吗?

1 个答案:

答案 0 :(得分:3)

C ++ / CLI ref类只能将.Net对象或原始类型作为成员保存 如果你想拥有一个C ++成员,你必须拥有一个指向它的指针。 (可以将其编译为足以容纳指针的整数类型。)

现在,如果你想检查线程是否同时运行,你可以做两件事:

  1. 暂停程序,查看线程窗口。 (调试 - &gt; Windows - &gt;主题)
    在这里你可以看到所有工作线程,但你可能不走运,并且&#34;想念&#34;显示两个线程都在工作的时间。

  2. 在每个帖子中添加一个长sleep()。就在开始工作之前。然后像(1)中那样暂停程序,如果你看到线程在sleep()上等待,那么这意味着它们会同时工作。