我正在尝试使用cv::LUT()
将sobel内核应用于Mat
。也就是说,我正在尝试为学习目的而做自己的索贝尔。
但是当我使用cv::LUT()
时,我收到错误:
OpenCV错误:断言失败((lutcn == cn || lutcn == 1)&& _lut.total()== 2 56&& _lut.isContinuous()&& (深度== CV_8U ||深度== CV_8S))在cv :: LUT,fil e C:\ builds \ master_PackSlave-win32-vc12-shared \ opencv \ modules \ core \ src \ convert.c pp,第5917行
出了什么问题?
void sobel(const Mat& src, Mat& horizGradient, Mat& vertGradient)
{
float kernelX[3][3] = {
{ -1, 0, 1 },
{ -2, 0, 2 },
{ -1, 0, 1 }
};
float kernelY[3][3] = {
{ -1, -2, -1 },
{ 0, 0, 0 },
{ 1, 2, 1 }
};
Mat kernelXMat(3, 3, CV_32FC1, &kernelX);
Mat kernelYMat(3, 3, CV_32FC1, &kernelY);
LUT(src, kernelXMat, horizGradient); // error occurs on this line
/*LUT(src, kernelYMat, vertGradient);*/
}
PS:在OpenCV中构建简单内核(Guassian,Laplacian,Sobel,Harrise)的最有效方法是什么?
也许我不能使用cv::LUT()
来执行索贝尔?我应该使用2 for循环?
答案 0 :(得分:0)
cv::LUT
不用于应用过滤器。例如,它用于执行 color mapping 。
要实现您的目标,您可以使用cv::filter2D
功能。
以下是一个展示如何应用过滤器的示例:
int main(int argc, char* argv[])
{
Mat image = imread("lena.bmp");
Mat grey;
cvtColor(image, grey, CV_BGR2GRAY);
float kernelX[3][3] = {
{ -1, 0, 1 },
{ -2, 0, 2 },
{ -1, 0, 1 }
};
float kernelY[3][3] = {
{ -1, -2, -1 },
{ 0, 0, 0 },
{ 1, 2, 1 }
};
Mat kernelXMat(3, 3, CV_32FC1, &kernelX);
Mat kernelYMat(3, 3, CV_32FC1, &kernelY);
Mat horizGradient, vertGradient, gradient;
filter2D(grey, horizGradient, -1, kernelXMat, Point(-1, -1));
filter2D(grey, vertGradient, -1, kernelYMat, Point(-1, -1));
gradient = max(horizGradient, vertGradient); // combining the two gradients
imshow("horizGradient", horizGradient);
imshow("vertGradient", vertGradient);
imshow("gradient", gradient);
waitKey(0);
return 0;
}
希望它有所帮助!