2015-03-27 2 views
0

Мысль, что я попробую свою руку при небольшом (авто) корреляции/свертке сегодня в 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':

1.png

И ядро, которое я хочу 'kernel.png':

kernel.png

Я пытаюсь увидеть, если Я могу получить горячую точку в dst в точке, где отображается фокус (ядро, которое я выбрал, -). Я знаю, что есть другие способы сделать это, но мне интересно посмотреть, насколько эффективна свертка над ним. (Автокорреляция я думаю, что это называется?)

Прямые вопросы:

  • почему крах?
  • - это крах, указывающий на принципиальную концептуальную ошибку?
  • или (надеюсь) это просто какая-то (глупая) ошибка в коде?

Заранее спасибо за любую помощь :)

ответ

2

Ошибка утверждения должна быть вывешена, который помог бы кто-то ответить вам, кроме допроса почему авария. В любом случае, я опубликовал ниже возможные ошибки и решение для свертки filter2D.

Ошибка 1:

OpenCV Ошибка: не удалось Assertion (src.channels() == 1 & & функ = 0!) В резюме :: countNo nZero, файл C: \ строит \ 2_4_PackSlave-win32 -vc12-shared \ opencv \ modules \ core \ src \ st at.cpp, line 549

Ваше входное изображение Изображение и ядро ​​должны быть серого. Вы можете использовать флаг 0 в imread. (например, cv :: imread ("kernel.png", 0) для чтения изображения в оттенках серого.) Если вы хотите применять разные ядра к различным каналам, разделите изображение на отдельные цветные плоскости с помощью split() и процесса их индивидуально.

Я не вижу ничего, кроме ошибки, которую может произойти сбой. Размер ядра должен быть нечетным, а образ вашего ядра - 11X11, что отлично.Если он по-прежнему сбой любезно предоставит больше информации, чтобы помочь вам.

+0

Совершенно верно! Я даже написал «одноканальную матрицу с плавающей запятой» в своих комментариях ... Однако в моей защите единственной обратной связью, которую я получил от VS, было «Необработанное исключение в 0x00007FF8C6EA8B9C в opencvTEST.exe: исключение Microsoft C++: cv :: Exception at ячейка памяти 0x000000521B2DED30. " Не упоминается «(src.channels() == 1 && func! = 0)« Как вы к этому обращаетесь? И, кроме того, ядром не являлся src, который должен был быть одним каналом, src работал на 3 канала ... Но, конечно, спасибо за вашу помощь, работает сейчас (но не так, как я надеялся, но это еще одно обсуждение:) –

Смежные вопросы