2016-08-30 2 views
1

Я использую VS2015, EmguCV 3 и VB и пытаюсь перевести некоторый код на C++.Использование OpenCV Mat в качестве массива: VB vs C++

C++

vector<vector<Point> > contours; 
vector<Vec4i> hierarchy; 
findContours(bw, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_NONE); 
for (size_t i = 0; i < contours.size(); ++i) 
{...} 

Я пытаюсь использовать некоторые ориентации объекта код, указанный в полном here. В основном код подскажет мне угол, на котором объект ориентирован в изображении. К сожалению, это код C++ и мозги разработчиков VB могут взорваться при виде синтаксиса C++. Любая помощь, позволяющая избежать необходимости очистки экрана снова, будет приветствоваться. В этом конкретном случае взрывчатый материал был vector<vector<point> > contours;, и мой вопрос о том, как его перевести.

Я получил это далеко:

VB

Imports Emgu.CV 
Imports Emgu.CV.Structure 
... 
contours = New Mat 
hierarchy = New Mat 
CvInvoke.FindContours(m, contours, hierarchy, CvEnum.RetrType.List, CvEnum.ChainApproxMethod.ChainApproxNone) 

Я использую EmguCV 3. Это утверждает, что FindContours принимает image As IInputOutputArray, contours As IOutputArray, hierarchy As IOutputArray. Поэтому я подумал, что могу предоставить три мата. m определено ранее, была успешно обработана (например, с Threshold), поэтому я доволен m. контуры и иерархия, с другой стороны, могут быть проблематичными. Когда я запускаю код, я получаю необработанное исключение:

Emgu.CV.Util.CvException: OpenCV: (_contours.kind() == _InputArray::STD_VECTOR_VECTOR || _contours.kind() == _InputArray::STD_VECTOR_MAT || _contours.kind() == _InputArray::STD_VECTOR_UMAT)

Это наводит на мысль, что я прошел неподходящие для OpenCV, хотя я ожидал бы Emgu, чтобы справиться с этим. Но я понятия не имею. Любая помощь?

+0

Похоже, что C++ '<' в этом контексте грубо переводится как '(' в VB, в то время как 'vector' грубо говорит массив. Но, что более важно, оказывается, что Emgu реализует тип, называемый VectorOfVectorOfPoint, с которым я сейчас экспериментирую. С иерархией, как 'VectorOfVectorOfPoint', а не' Mat', мой код теперь, по крайней мере, работает без сбоев, так что это прогресс! ;-) – Nobody

ответ

1

На основе Documentation и в разделе VB:

"контуры Тип:. Emgu.CV.IOutputArray -> Обнаруженные контуров Каждый контур хранится в виде вектора точек".

Таким образом, вместо того, чтобы посылать один MAT в качестве contours, вы должны посылать контейнер векторов точек.

См. Здесь The Equivalent of C++ Vectors for VB.Net.

+0

Ah ... контейнер векторов точек! Да, конечно 8- /! Хорошо, я постараюсь выяснить, что это такое. Большое спасибо за указатель. – Nobody

+0

Да, очевидно. Рад, что мы смогли помочь :);) –

+0

Итак, оказывается, что для этой цели Emgu предоставляет класс, называемый VectorOfVectorOfPoints. У меня теперь есть рабочий код! Благодарю. – Nobody

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