调用静态内联函数[关闭]
Posted
技术标签:
【中文标题】调用静态内联函数[关闭]【英文标题】:Calling a static inline function [closed] 【发布时间】:2014-02-14 08:24:47 【问题描述】:如何调用这个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 的结果。帮我计算一下上面程序中的gx
和gy
。
这是我的代码
#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++;
【问题讨论】:
定义“不得到gx和gy的结果”不打印吗?或者你得到了一个你没想到的价值?inline
也不会改变你的程序的行为,它只是一个优化的东西(你的编译器可以选择忽略)
你说“没有得到gx和gy的结果”是什么意思?就像不是您期望的结果?您能否编辑问题以显示您的期望以及实际得到的结果? data
是什么? ii
是什么? x
和 y
是什么? 和所有这些变量的值的声明是什么?另外,您是否尝试过在调试器中单步执行代码以查看它的实际作用?
令人惊叹,它甚至可以编译,给定图像 [y-1, x] bs。
@berak 这是简单的comma operator。并不是说它对显示的代码的上下文有意义,但它仍然是一个有效的表达式。
是的,正确的,所以只有逗号的右侧被评估
【参考方案1】:
我想,你在这里混淆了 python/numpy 和 c++ 语法。
虽然image[y-1, x-1]
会在 python 中做正确的工作(给定一个二维 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 个像素的边框,否则您会超出范围...
【讨论】:
我在如何获取 xGradient 和 ygradient 的值时遇到了麻烦。我应该怎么做才能调用你写的函数? 因为我想使用 uchar*。如何从 xGradient 调用 uchar?以上是关于调用静态内联函数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章