Собел Android C ++ OpenCV без библиотеки

Я пытаюсь реализовать распознавание края sobel с использованием C ++ в Android Studio с минимальной помощью библиотеки. Я должен написать алгоритм самостоятельно, поэтому я не могу использовать sobel или любую другую функцию, предоставляемую OpenCV.

Проблема в том, что данный вывод выглядит абстрактно
выходное изображение. Я не могу найти какое-либо соответствующее обсуждение для этого.

Я использую 4-канальный мат 8UC4 с вызовами JNI для C ++. и структура для содержания изображения, описанного здесь stackoverflow.com/questions/24319406/

Любая помощь будет оценена. Большое спасибо.

вот фрагмент кода:

#pragma pack(push, 2)
struct RGB {
uchar red;
uchar green;
uchar blue;
float alfa;
};

приведенный выше код показывает структуру

extern "C"JNIEXPORT void JNICALL
Java_com_example_rakad_skripsi_1c_1realtime_RealTimeDetection_gscale(JNIEnv *env, jobject, jlong frame){
Mat& Frame = *(Mat*)frame;

int row = Frame.rows;
int col = Frame.cols;

GaussianBlur( Frame, Frame, Size( 7, 7), 0, 0 ); // Optional Noise Reduction

for (int y = 0; y < row; y++) {
for (int x = 0; x < col; x++) {
//GET PIXEL VALUE
RGB& frm = Frame.ptr<RGB>(y)[x];
uchar gray = (frm.blue * 0.587) + (frm.green * 0.114) + (frm.red * 0.299); //Grayscale

//REPLACE PIXEL VALUE
frm.red = gray;
frm.blue = gray;
frm.green = gray;
}
}
}

приведенный выше код — это метод оттенков серого. Этот метод работает без проблем с 20+ кадров в секунду в режиме реального времени.

extern "C"JNIEXPORT void JNICALL
Java_com_example_rakad_skripsi_1c_1realtime_RealTimeDetection_sobel(JNIEnv *env, jobject, jlong frame){
Mat& Frame = *(Mat*)frame;

int row = Frame.rows;
int col = Frame.cols;

/*SOBEL OPERATOR MATRIX

Gx =    [   -1   0   1  ]       Gy =    [    1    2    1   ]
[   -2   0   2  ]               [    0    0    0   ]
[   -1   0   1  ]               [   -1   -2   -1   ]
*/

/*IMAGE MATRIX

Image =   [   1   2   3   ]
[   4   5   6   ]
[   7   8   9   ]
*/

for (int x = 0; x < row; x++) {
for (int y = 0; y < col; y++) {

int gradX, gradY, grad = 0;
RGB& mid = Frame.ptr<RGB>(x)[y];

if (x == 0 || x == row-1 || y == 0 || y == col-1){

gradX = gradY = 0;

} else {

RGB& px1 = Frame.ptr<RGB>(x-1)[y-1];   RGB& px2 = Frame.ptr<RGB>(x)[y-1];     RGB& px3 = Frame.ptr<RGB>(x+1)[y-1];
RGB& px4 = Frame.ptr<RGB>(x-1)[y];                                            RGB& px6 = Frame.ptr<RGB>(x+1)[y];
RGB& px7 = Frame.ptr<RGB>(x-1)[y+1];   RGB& px8 = Frame.ptr<RGB>(x)[y+1];     RGB& px9 = Frame.ptr<RGB>(x+1)[y+1];

gradX = (px1.red * (-1)) + (px4.red * (-2)) + (px7.red * (-1)) + (px3.red) + (px6.red * 2) + (px9.red);

gradY = (px7.red * (-1)) + (px8.red * (-2)) + (px9.red * (-1)) + (px1.red) + (px2.red * 2) + (px3.red);

}

grad = sqrt((gradX*gradX) + (gradY*gradY));
saturate_cast<uchar>(grad);

mid.red = grad;
mid.green = grad;
mid.blue = grad;
}
}
}

приведенный выше код является проблемой. это показывает картину, упомянутую ранее.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]