Я работаю над алгоритмом обработки изображений для обнаружения маркеров. Код использует библиотеку opencv и отлично работает. Однако меня попросили поместить его в HDL с помощью HLS для оптимизации дизайна. Дело в том, что HLS не позволяет использовать многие структуры и формы, используемые в стандартном коде. Моя основная проблема заключается в том, что я использую переменную, определенную как Vec3b
, которая не может быть синтезирована HLS.
Я прочитал это из документации opencv:
Vec : template class for short numerical vectors, a partial case of Matx
template<typename _Tp, int n> class Vec : public Matx<_Tp, n, 1> {...};
typedef Vec<uchar, 3> Vec3b;
Не вдаваясь в подробности о HLS, я хотел бы знать, можно ли заменить тип Vec3b
таким, который можно было бы синтезировать, например Scalar_
, или вернуть его как простой Matx
. Что касается скаляров, я нашел это в документе:
It is possible to convert Vec<T,2> to/from Point_, Vec<T,3> to/from Point3_ , and Vec<T,4> to CvScalar or Scalar_. Use operator[] to access the elements of Vec.
Я также размещаю здесь весь код на случай, если он понадобится. Я не автор, поэтому написано по-испански.
void recorroHorizontal(){
for(int i=0;i<480;i++){
colorAux=enHSB.at<Vec3b>(0,i); //Cuidado con el acceso al revés
int punto_anterior = (int)(colorAux[2]);
for(int j=1;j<640-1;j++){
colorAux=enHSB.at<Vec3b>(i,j); //al reves j e i
float brightness=colorAux[2];
int brightnessi=(int)(brightness);
h_pendientes[i][j]=brightnessi- punto_anterior;
if(!(h_pendientes[i][j]>VALOR_PENDIENTE || h_pendientes[i][j]<-VALOR_PENDIENTE)){
if(!(h_pendientes[i][j] + h_pendientes[i][j-1] >VALOR_PENDIENTE_TRUNCAR || h_pendientes[i][j] + h_pendientes[i][j+1]<-VALOR_PENDIENTE_TRUNCAR)){
h_pendientes[i][j]=0;
}
}
if(j<2 || i<2 || 640-1 ==i){h_pendientes[i][j]=0;}
punto_anterior=brightnessi;
original[i][j]=brightnessi;
}
}
}