2014-02-14 74 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