Я работаю над алгоритмом обработки изображений для обнаружения маркеров. Код использует библиотеку 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;
Не вдаваясь в подробности о ЗОЖ, хотелось бы узнать, можно ли заменить 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;
}
}
}
Я не понимаю ни HLS, ни того, что хочет делать этот код на C ++ / испанском. Если HLS что-то, что интерпретирует код C ++, ему трудно понять структуры или типы, определенные вне кода, например, в ссылочной библиотеке.
Я перевел ваш код построчно. Я просто изменил ваш способ доступа к значению интенсивности каждого пикселя в изображении.
Чтобы что-то заработало, я определил некоторые переменные, которые вы должны были уточнить, как:
#define VALOR_PENDIENTE 10
#define VALOR_PENDIENTE_TRUNCAR 10
int** h_pendientes;
int** original;
h_pendientes = new int*[480];
original = new int*[480];
for (int i = 0; i < 480; ++i)
{
h_pendientes[i] = new int[640 - 1];
original[i] = new int[640 - 1];
}
Если вы в дальнейшем сообщите мне свою цель, каковы эти ценности, я буду более чем рад помочь вам.
#include<opencv2/highgui.hpp>
#include<opencv2/core.hpp>
using namespace cv;
#define VALOR_PENDIENTE 10
#define VALOR_PENDIENTE_TRUNCAR 10
int main()
{
Mat image = cv::imread("Lenna.png", CV_LOAD_IMAGE_ANYCOLOR);
const int height = image.cols;
const int width = image.rows;
uchar * imageData = image.data;
int** h_pendientes;
int** original;
h_pendientes = new int*[480];
original = new int*[480];
for (int i = 0; i < 480; ++i)
{
h_pendientes[i] = new int[640 - 1];
original[i] = new int[640 - 1];
}
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]);
/*
* The code piece above assigns first pixel in each row to colorAux. It is a struct which
* includes blue,green,red. punto_anterior is assigned to pixels red intensity as integer
* In short, punto_anterior is red intensity of 0th pixel in each row.
*/
int index = 0 * width + i;
int punto_anterior = (int)imageData[3 * index + 2]; // access red intensity of pixel.
for (int j = 1; j < 640 - 1; ++j)
{
int indexReverse = i*width + j;
int brightness = (int)imageData[3 * index + 2];
h_pendientes[i][j] = brightness - 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 = brightness;
original[i][j] = brightness;
}
}
}
В конце концов я заменил Vec3b
наберите таблицу Scalar (или, если быть более точным, hls :: Saclar, структуру из hls_video.h
).
Я тогда доступ к данным в этой таблице с .val[]
,
Кажется, что это работает, даже если это может быть проблемой при общении с программным обеспечением.