Мысль, что я попробую свою руку при небольшом (авто) корреляции/свертке сегодня в openCV и создам собственное 2D-фильтрующее ядро.Использование пользовательского ядра в opencv 2DFilter - причиной сбоя ... свертки как?
После OpenCV-х 2D Filter Tutorial я обнаружил, что делает ваши собственные ядра для OpenCV-х Filter2Dможет быть не так трудно. Однако, когда я пытаюсь использовать его, я получаю необработанные исключения.
код с комментариями, касающихся вопроса здесь:
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
//Loading the source image
Mat src;
src = imread("1.png");
//Output image of the same size and the same number of channels as src.
Mat dst;
//Mat dst = src.clone(); //didn't help...
//desired depth of the destination image
//negative so dst will be the same as src.depth()
int ddepth = -1;
//the convolution kernel, a single-channel floating point matrix:
Mat kernel = imread("kernel.png");
kernel.convertTo(kernel, CV_32F); //<<not working
//normalize(kernel, kernel, 1.0, 0.0, 4, -1, noArray()); //doesn't help
//cout << kernel.size() << endl; // ... gives 11, 11
//however, the example from tutorial that does work:
//kernel = Mat::ones(11, 11, CV_32F)/ (float)(11*11);
//default value (-1,-1) here means that the anchor is at the kernel center.
Point anchor = Point(-1,-1);
//value added to the filtered pixels before storing them in dst.
double delta = 0;
//alright, let's do this...
filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT);
imshow("Source", src); //<< unhandled exception here
imshow("Kernel", kernel);
imshow("Destination", dst);
waitKey(1000000);
return 0;
}
Как вы можете видеть, используя ядро учебники отлично работает, но мой образ будет врезаться программу, я попытался изменить битовую глубину, нормализуя, проверяя размер и много комментариев блоков, чтобы увидеть, где это не удается, но еще не взломали его.
Изображение '1.png':
И ядро, которое я хочу 'kernel.png':
Я пытаюсь увидеть, если Я могу получить горячую точку в dst в точке, где отображается фокус (ядро, которое я выбрал, -). Я знаю, что есть другие способы сделать это, но мне интересно посмотреть, насколько эффективна свертка над ним. (Автокорреляция я думаю, что это называется?)
Прямые вопросы:
- почему крах?
- - это крах, указывающий на принципиальную концептуальную ошибку?
- или (надеюсь) это просто какая-то (глупая) ошибка в коде?
Заранее спасибо за любую помощь :)
Совершенно верно! Я даже написал «одноканальную матрицу с плавающей запятой» в своих комментариях ... Однако в моей защите единственной обратной связью, которую я получил от VS, было «Необработанное исключение в 0x00007FF8C6EA8B9C в opencvTEST.exe: исключение Microsoft C++: cv :: Exception at ячейка памяти 0x000000521B2DED30. " Не упоминается «(src.channels() == 1 && func! = 0)« Как вы к этому обращаетесь? И, кроме того, ядром не являлся src, который должен был быть одним каналом, src работал на 3 канала ... Но, конечно, спасибо за вашу помощь, работает сейчас (но не так, как я надеялся, но это еще одно обсуждение:) –