在Qt文件中调用接口函数,文件目录如下:
但是在mainwindow.cpp里使用类margin的方法roberts却报错,不知道原因。在头文件里也声明了函数。
报错问题如下:
E:\opencv4\margindetect\mainwindow.cpp:46: error: no matching function for call to 'margin::roberts(QImage&, cv::Mat&, int, int, int)'
..\margindetect\mainwindow.cpp:46:51: error: no matching function for call to 'margin::roberts(QImage&, cv::Mat&, int, int, int)'
Robert.roberts(myQImg, imgDst, CV_32FC1, 0, 1); ^
margin.hpp文件如下
#ifndef MARGIN_H
#define MARGIN_H
#include<opencv2/opencv.hpp>
using namespace cv;
void conv2D(Mat src,Mat kernel, Mat dst, int ddepth, Point2f anchor);
void sepConv2D_Y_X(Mat src, Mat src_kerY_kerX, int ddepth, Mat kernelY, Mat kernelX, Point2f anchor);
class margin
{
public:
void roberts(cv::Mat src, cv::Mat dst, int ddepth, int x, int y );
void prewitt(cv::Mat src, cv::Mat dst, int ddepth, int x, int y );
};
#endif // MARGIN_H
在mainwindow里调用如下:
void MainWindow::img_Roberts()
{
margin Robert;
Mat imgData = imread(imgPath.toLatin1().data());
Mat imgDst = Mat::zeros(imgData.size(),imgData.type());
cvtColor(imgData, imgData, COLOR_BGR2GRAY);
myImg = imgData;
myQImg = QImage((const unsigned char*)(imgData.data), imgData.cols, imgData.rows, QImage::Format_Grayscale8);
Robert.roberts(myQImg, imgDst, CV_32FC1, 0, 1); //这里出现bug
convertScaleAbs(imgDst, myQImg1, 1, 0);
imgShow1();
}
margin中函数文件如下
#include<opencv2/opencv.hpp>
#include"margin.h"
using namespace cv;
void conv2D(Mat src,Mat kernel, Mat dst, int ddepth, Point2f anchor)
{
Mat kernelFlip;
flip(kernel, kernelFlip, -1);
filter2D(src, dst, ddepth, kernelFlip, anchor, 0.0);
}
void sepConv2D_Y_X(Mat src, Mat src_kerY_kerX, int ddepth, Mat kernelY, Mat kernelX, Point2f anchor)
{
//输入矩阵与垂直方向上的卷积核的卷积
Mat src_kerY;
conv2D(src, kernelY, src_kerY, ddepth, anchor);
//得到上面的卷积结果,接着和水平方向上的卷积核卷积
conv2D(src_kerY, kernelX, src_kerY_kerX, ddepth, anchor);
}
void margin::roberts(Mat src, Mat dst, int ddepth, int x, int y)
{
CV_Assert(!(x == 0 && y == 0)); //若括号中的表达式值为false,则返回一个错误信息
Mat roberts_1 = (Mat_<float>(2, 2) << 1, 0, 0, -1);
Mat roberts_2 = (Mat_<float>(2, 2) << 0, 1, -1, 0);
//x!=0时,135型卷积
if (x != 0 && y == 0)
{
conv2D(src,roberts_1,dst,ddepth,Point(0,0));
}
//y!=0时,45型卷积
if (y != 0 && x == 0)
{
conv2D(src, roberts_2, dst, ddepth, Point(1,0));
}
}