2015-11-24 3 views
0

I holpe вы можете мне помочь. Я сейчас переводил некоторый код matlab в C++ с opencv, но он не работает ...Matlab convn in openCV

Теперь я не уверен, если это из-за моего неправильного перевода или если я пропустил что-то.

Matlab:

R=rmin:rmax; 
count=size(R,2); 
for k=1:count 
    [L(k)]=lineint(I,C,R(k),n,part); 
    if L(k)==0 
     L(k)=[]; 
     break; 
    end 
end 

D=diff(L); 
D=[0 D]; 

if strcmp(sigma,'inf')==1 
    f=ones(1,7)/7; 
else 
    f=fspecial('gaussian',[1,5],sigma); 
end 

blur=convn(D,f,'same');%Smooths the D vecor by 1-D convolution 
blur=abs(blur); 
[b,i]=max(blur); 
r=R(i); 
b=blur(i); 

OpenCV:

std::vector<double> L; 
std::vector<int> radii; 
std::vector<void*> result; 
cv::Mat blur; 
cv::Mat kernel; 

for (int i = rmin; i <= rmax; i++) { 
    double tmp = lineint(I, C, i, n, part); 
    if (tmp != 0) { 
     L.push_back(tmp); 
     radii.push_back(i); 
    } 
    else 
     break; 
} 

std::vector<double> D; 
D.push_back(0); 
for (int i = 1; i < L.size(); i++) { 
    double tmp = L.at(i-1) - L.at(i); 
    D.push_back(tmp >= 0 ? tmp : -1 * tmp); 
} 

//inf case 
if (sigma < -1) { 
    kernel = cv::Mat::ones(Size(1, 7), CV_32FC1)/7; 
} 
else { 
    kernel = cv::getGaussianKernel(5, sigma, CV_32FC1); 
} 

//flip vertical and horizontal 
//rearange anchor 
//http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html#filter2d 
cv::flip(kernel, kernel, -1); 
cv::Point anchor = cv::Point(-1, -1); 
anchor = cv::Point(kernel.cols - anchor.x - 1, kernel.rows - anchor.y - 1); 
cout << anchor << "|" << kernel << endl; 
cv::filter2D(D, blur, -1, kernel, anchor, 0.0f, BORDER_DEFAULT); 
blur = cv::abs(blur); 

double min, max; 
cv::Point min_loc, max_loc; 
cv::minMaxLoc(blur, &min, &max, &min_loc, &max_loc); 
int radius = (rmin + max_loc.y); 

result.push_back(&max); 
result.push_back(&radius); 

Спасибо!

Редактировать: К сожалению пропустил сообщение об ошибке:

OpenCV Error: Assertion failed (anchor.inside(Rect(0, 0, ksize.width, ksize.height))) in cv::normalizeAnchor, file c:\builds\master_packslave-win64-vc12-shared\opencv\modules\imgproc\src\filterengine.hpp, line 363 

Это происходит, когда я применить фильтр на filter2D

Edit2: Это работает, если удалить обновления свертке (удалить флип и перестановка анкера)

+0

В чем проблема? Показать сообщение ошибки –

+0

Что не работает? Можете ли вы указать конкретное сообщение об ошибке, которое вы видите? – Naytzyrhc

+0

Извините, что забыл добавить сообщение, обновил сообщение –

ответ

0

ОК Я думаю, что я исправил его (на самом деле ошибка нет, я не уверен, если результаты одинаковы)

Я использовал функцию, представленную здесь: http://blog.timmlinder.com/2011/07/opencv-equivalent-to-matlabs-conv2-function/

void conv2(cv::Mat &img, cv::Mat& kernel, int type, cv::Mat& dest) { 
    cv::Mat source = img; 
    if (CONVOLUTION_FULL == type) { 
     source = cv::Mat(); 
     const int additionalRows = kernel.rows - 1, additionalCols = kernel.cols - 1; 
     cv::copyMakeBorder(img, source, (additionalRows + 1)/2, additionalRows/2, (additionalCols + 1)/2, additionalCols/2, BORDER_CONSTANT, Scalar(0)); 
    } 

    cv::Point anchor(kernel.cols - kernel.cols/2 - 1, kernel.rows - kernel.rows/2 - 1); 
    int borderMode = BORDER_CONSTANT; 
    cv::flip(kernel, kernel, -1); 
    cv::filter2D(source, dest, img.depth(), kernel , anchor, 0, borderMode); 

    if (CONVOLUTION_VALID == type) { 
     dest = dest.colRange((kernel.cols - 1)/2, dest.cols - kernel.cols/2) 
     .rowRange((kernel.rows - 1)/2, dest.rows - kernel.rows/2); 
    } 
} 

Он основно выравнивает якорь по-другому. Я посмотрю, достаточно ли результатов