我在撰寫marrEdge檢測的時候始終提示斷言錯誤

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/core/core.hpp>
#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
using namespace cv;
void marrEdge(const Mat src, Mat result, int kerValue,double delta)
{
//計算LOG算子
Mat kernel;
//半徑
int kerLen = kerValue / 2;
kernel = Mat_<double>(kerValue, kerValue);
//滑窗
for (int i = -kerLen; i <= kerLen; i++)
{
for (int j = -kerLen; j <= kerLen; j++)
{
//生成核因子
kernel.at<double>(i+kerLen, j+kerLen ) =
exp(-((pow(j, 2) + pow(i, 2)) / (pow(delta, 2) * 2))*(((pow(j, 2) + pow(i, 2) - 2 * pow(delta, 2)) / (2 * pow(delta, 4)))));
}
}
//設定輸出引數
int kerOffset = kerValue / 2;
Mat laplacian = (Mat_<double>(src.rows - kerOffset * 2, src.cols - kerOffset * 2));
result = Mat::zeros(src.rows - kerOffset * 2, src.cols - kerOffset * 2, src.type());
double sumLaplacian;
//遍歷計算卷積影像的拉普拉斯算子
for (int i = kerOffset; i < src.rows - kerOffset; ++i)
{
for (int j = kerOffset; j< src.cols - kerOffset; ++j)
{
sumLaplacian = 0;
for (int k = -kerOffset; k <= kerOffset; ++k)
{
for (int m = -kerOffset; m <= kerOffset; ++m)
{
//計算影像卷積
sumLaplacian += src.at<uchar>(i + k, j + m)*kernel.at<double>(kerOffset+k,kerOffset+m);
}
}
laplacian.at < double >(i - kerOffset, j - kerOffset) = sumLaplacian;
}
}
//過零點交叉 需按照邊緣像素
for (int y = 1; y < result.rows - 1; ++y)
{
for (int x =1; x < result.cols; ++x)
{
result.at<uchar>(y, x) = 0;
//鄰域判定
if (laplacian.at<double>(y - 1, x)*laplacian.at<double>(y + 1, x) < 0)
result.at<uchar>(y, x) = 255;
if (laplacian.at<double>(y , x-1)*laplacian.at<double>(y , x+1) < 0)
result.at<uchar>(y, x) = 255;
if (laplacian.at<double>(y - 1, x+1)*laplacian.at<double>(y + 1, x-1) < 0)
result.at<uchar>(y, x) = 255;
if (laplacian.at<double>(y - 1, x-1)*laplacian.at<double>(y + 1, x+1) < 0)
result.at<uchar>(y, x) = 255;
}
}
}
int main()
{
Mat srcImage = imread("1.jpg");
if (!srcImage.data)
return -1;
Mat srcGray(srcImage.size(),srcImage.type());
cvtColor(srcImage, srcGray, CV_BGR2GRAY);
Mat edge;
marrEdge(srcGray, edge,9, 1.6);
imshow("src", srcImage);
imshow("edge", edge);
waitKey(0);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/46956.html
標籤:圖形處理/算法
上一篇:Duilib編譯遇見提示說未定義的HANDLE hFile,將紅色字體部分移動到CreateFile后面就不再報錯了,什么原因?使用的是Win7和VS2017
下一篇:求基于LZW演算法的資料壓縮程式
