c++ - 调用静态内联函数

标签 c++ visual-c++ opencv

<分区>

如何调用这个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

this my code

#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;
}

i got wrong in this code

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++;
}

最佳答案

我认为,您在这里混淆了 python/numpy 和 c++ 语法。

虽然 image[y-1, x-1] 会在 python 中完成正确的工作(给定一个 2d numpy 数组),

在 C++ 中,您只有一个 1d uchar 数组,它归结为 image[x-1] 。可能不是您所期望的。

要做到这一点,您的函数还需要一个额外的参数,即 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 中,为什么不使用 Mat 对象本身,而不是原始字节:

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 像素的边框,否则您会越界 ...

关于c++ - 调用静态内联函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21774184/

相关文章:

c++ - call_once 通过双重检查锁定模式实现

C++ 包含混淆

opencv - 在 OpenCV 中关闭等高线曲线

c++ - 在托管 C++ GUI 中通过另一个事件结束/中断/切换一个事件

visual-c++ - 使用 SIFT 和 ORB 特征在 OpenCV 中训练 SVM 分类器

python - 无法使用 Anaconda 解释器在 PyCharm GUI 中安装 OpenCV

c++ - 前缀运算符的实现

C++ V8 对象上下文

c++ - 无法在 Windows 7 中执行 makefile

c++ - 指向 STL 映射中函数的指针