Преобразование типа vec в скалярный тип на opencv

Я работаю над алгоритмом обработки изображений для обнаружения маркеров. Код использует библиотеку 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;
        }
    }
}

person Valentin Dubois    schedule 22.06.2017    source источник
comment
Что означает HDL и HLS?   -  person ZdaR    schedule 22.06.2017
comment
@ZdaR HDL расшифровывается как Hardware Description Language, язык, описывающий аппаратный IP. HLS означает синтез высокого уровня, который представляет собой метод, используемый для перевода языка высокого уровня, такого как C++, в HDL.   -  person Valentin Dubois    schedule 26.06.2017


Ответы (2)


Я не понимаю ни 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;
        }
    }

}
person Muhammet Ali Asan    schedule 22.06.2017

В конце концов я заменил тип Vec3b на таблицу Scalar (или hls::Saclar, если быть точнее, структуру из hls_video.h). Затем я получаю доступ к данным в этой таблице с помощью .val[].

Кажется, это работает, даже если это может быть проблемой при общении с программным обеспечением.

person Valentin Dubois    schedule 26.06.2017