调用静态内联函数
Calling a static inline function
如何调用此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++;
}
我认为,您混淆了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像素的边界,否则你就越界了。。。
相关文章:
- enable_if转换构造函数(静态强制转换,is_base_of)
- 声明和定义函数静态会产生"undefined reference to function_name()"
- 有没有一种方法可以使全局函数/静态成员函数一次可呼出
- C++ - 模板类 -> 静态函数 -> 静态函数指针的链接错误
- 获取 llvm::函数静态地址
- 成员函数静态变量与成员变量
- 如何将sqlite3+扩展函数静态链接到C/C++应用程序中
- Visual Studio 2015 Natvis如何显示函数静态变量
- 返回一个指向函数静态数据的指针合适吗
- 如何将函数静态应用于非类型模板包的各个元素并对结果求和
- 是否可以通过编程方式创建函数静态对象
- 函数静态变量析构函数和线程
- 函数静态成员变量
- 隐藏模板化的辅助函数——静态成员或未命名的命名空间
- 这个解决方案对MSVC的双重检查锁定错误和函数静态有什么问题?
- 类成员函数静态和私有
- c++函数静态局部,性能好
- 函数静态变量初始化
- 使用基类中的函数静态地调用纯虚函数的派生类实现
- 使成员函数静态会使程序无法编译。想不通为什么