2014-02-14 75 views
0

如何調用此函數static inline函數?調用靜態內聯函數

static inline int xGradient(uchar* image, int x, int y) 
{ 
    return ((int)(image[y-1, x-1])) + 
     2*image[y, x-1] + 
     image[y+1, x-1] - 
     image[y-1, x+1] - 
     2*image[y, x+1] - 
     image[y+1, x+1]; 
} 

static inline int yGradient(uchar* image, int x, int y) 
{ 
    return ((int)(image[y-1, x-1])) + 
     2*image[y-1, x] + 
     image[y-1, x+1] - 
     image[y+1, x-1] - 
     2*image[y+1, x] - 
     image[y+1, x+1]; 

我在調用函數時遇到麻煩。我這樣稱呼它:

gx = xGradient(&data[ii], x,y); 
gy = yGradient(&data[ii], x,y); 
sum = abs(gx) + abs(gy); 
sum = sum > 255 ? 255:sum; 
sum = sum < 0 ? 0 : sum; 

我沒有得到gx和gy的結果。幫我在上面的程序中計算gxgy

這是我的代碼

#include<iostream> 
#include<omp.h> 
#include<ctime> 
#include<cmath> 
#include<opencv2/imgproc/imgproc.hpp> 
#include<opencv2/highgui/highgui.hpp> 

using namespace std; 
using namespace cv; 

static inline int xGradient(uchar* image, int x, int y) 
{ 
return ((int)(image[y-1, x-1])) + 
     2*image[y, x-1] + 
     image[y+1, x-1] - 
     image[y-1, x+1] - 
     2*image[y, x+1] - 
     image[y+1, x+1]; 
} 

static inline int yGradient(uchar* image, int x, int y) 
{ 
return ((int)(image[y-1, x-1])) + 
     2*image[y-1, x] + 
     image[y-1, x+1] - 
     image[y+1, x-1] - 
     2*image[y+1, x] - 
     image[y+1, x+1]; 
} 

int main() 
{ 
Mat src, grey, grey2, dst; 
clock_t start, finish; 
int gx, gy, sum; 
size_t total; 
int sizes[2]; 
start = clock(); 

src= imread("E:/sobel/Debug/view_sea.bmp"); 
imwrite("E:/sobel/Debug/Serial/Citra Asli.bmp", src); 

cvtColor(src,grey,CV_BGR2GRAY); 
imwrite("E:/sobel/Debug/Serial/Grayscale.bmp", grey); 

dst = grey.clone(); 
if(!grey.data) 
{ 
    return -1; 
} 

total=grey.total(); 
cv::Size s = grey.size(); 
sizes[0] = s.height; 
sizes[1] = s.width; 
cout << "citra terdiri dari " << total << " piksel dengan ukuran " << sizes[0] << " x " << sizes[1] << " piksel" << endl; 

int starty=(grey.rows); 
if(starty==0) 
{starty=1;} 
int stopy=(grey.rows); 
if(stopy>grey.rows - 1) 
{stopy=grey.rows - 1;} 

int ii=grey.cols; 
uchar* data=grey.data; 

for(int y = starty; y < stopy; y++) 
{ 
    ii++; 
    for(int x = 1; x < sizes[1] - 1; x++) 
    { 
     gx = xGradient(&data[ii], x,y); 
     gy = yGradient(&data[ii], x,y); 
     sum = abs(gx) + abs(gy); 
     sum = sum > 255 ? 255:sum; 
     sum = sum < 0 ? 0 : sum; 
     data[ii] = sum; 
     ii++; 

    } 
    ii++; 
} 

finish = clock(); 

imwrite("E:/sobel/Debug/Serial/Output sobel dengan Serial.bmp", src); 

cout << "Waktu Eksekusi Deteksi Tepi Serial adalah : " << float(finish- start)/CLOCKS_PER_SEC << " detik" << endl; 
return 0; 
} 

我在此代碼

int ii=grey.cols; 
uchar* data=grey.data; 

for(int y = starty; y < stopy; y++) 
{ 
    ii++; 
    for(int x = 1; x < sizes[1] - 1; x++) 
    { 
     gx = xGradient(&data[ii], x,y); 
     gy = yGradient(&data[ii], x,y); 
     sum = abs(gx) + abs(gy); 
     sum = sum > 255 ? 255:sum; 
     sum = sum < 0 ? 0 : sum; 
     data[ii] = sum; 
     ii++; 

    } 
    ii++; 
} 
+3

定義「不要gx和gy的結果「是否不打印? T'或者你獲得了你沒有想到的價值?另外'inline'不會改變程序的行爲,它只是一個優化的東西(你的編譯器可以選擇忽略) – olevegard

+3

當你說你「沒有得到gx和gy的結果」時,你是什麼意思?像不是你期望的結果?你能否編輯這個問題來展示你的期望,以及你實際得到了什麼?什麼是'數據'?什麼是'ii'?什麼是'x'和'y'?什麼是聲明*和*所有這些變量的值?另外,您是否嘗試在調試器中逐步查看代碼,以瞭解它的真實含義? –

+1

令人驚歎,它甚至編譯,給出圖像[y-1,x] bs。 – berak

回答

4

我想,你糊塗了蟒蛇/ numpy的和C++的語法在這裏得到了錯誤的。

image[y-1, x-1]會做在python不務正業(給出一個二維數組numpy的),

在C++中,你只得到了一維數組UCHAR

,把它歸結爲image[x-1]。可能不是你所期望的。

做是正確的,也是你的功能需要額外的PARAM,1行的大小(寬度):再次

static inline int xGradient(uchar* image, int x, int y, int W) 
{ 
    return (
     image[ W*(y-1) + (x-1)] + 
     2*image[ W*(y) + (x-1)] + 
     image[ W*(y+1) + (x-1)] - 
     image[ W*(y-1) + (x+1)] - 
     2*image[ W*(y) + (x+1)] - 
     image[ W*(y+1) + (x+1)]); 
} 

,但是由於我們在OpenCV的,爲什麼不使用墊目標本身,而不是原始字節:

static inline int xGradient(const Mat & img, int x, int y) 
{ 
    return (
     img.at<uchar>((y-1) , (x-1)) + 
     2*img.at<uchar>((y) , (x-1)) + 
     img.at<uchar>((y+1) , (x-1)) - 
     img.at<uchar>((y-1) , (x+1)) - 
     2*img.at<uchar>((y) , (x+1)) - 
     img.at<uchar>((y+1) , (x+1))); 
} 
// and call it : 
Mat img; 
int xg = xGradient(img,x,y); 

記住,應用這個時候你要離開了1個像素的邊框在你的形象,否則你出界...

+0

我遇到了麻煩,如何獲得xGradient和ygradient的價值。你應該怎麼做才能調用函數? – Monic92

+0

,因爲我想使用uchar *。如何從xGradient調用uchar? – Monic92