C++基础|opencv学习笔记(1)

opencv学习笔记(1) filter相关 【C++基础|opencv学习笔记(1)】文章相关代码参考opencv官方指导
filter的具体原理实现

#include #include #include #include using namespace std; using namespace cv; void Sharpen(const Mat& myImage,Mat& Result); int main(int argc, char** argv) { const char* filename = argc >= 2 ? argv[1] : "../sc2-3.jpg"; Mat src, dst0, dst1; if (argc >= 3 && !strcmp("G",argv[2])) src = https://www.it610.com/article/imread(filename, IMREAD_GRAYSCALE); else src = imread(filename, IMREAD_COLOR); if (src.empty()) { cerr <<"Can not open the file [" << filename << "]" << endl; return -1; }namedWindow("input", WINDOW_AUTOSIZE); namedWindow("output", WINDOW_AUTOSIZE); imshow("input", src); double t = (double)getTickCount(); Sharpen( src, dst0 ); t = ((double)getTickCount() - t)/getTickFrequency(); cout << "Hand written function time passed in seconds: " << t << endl; imshow( "output", dst0 ); waitKey(0); }void Sharpen(const Mat& myImage,Mat& Result) { CV_Assert(myImage.depth() == CV_8U); const int nChannels = myImage.channels(); Result.create(myImage.size(),myImage.type()); for (int j = 1; j < myImage.rows-1; ++j) { const uchar *previous = myImage.ptr(j - 1); const uchar *current = myImage.ptr(j); const uchar *next = myImage.ptr(j + 1); uchar *output = Result.ptr(j); for (int i = nChannels; i < nChannels*(myImage.cols-1); ++i) { *output++ = saturate_cast(5 * current[i] - current[i - nChannels] - current[i + nChannels] - previous[i] - next[i]); }Result.row(0).setTo(Scalar(0)); Result.row(Result.rows-1).setTo(Scalar(0)); Result.col(0).setTo(Scalar(0)); Result.col(Result.cols-1).setTo(Scalar(0)); } }

  • cerr用于抛出异常。
    cerr << "Can not open the file [" << filename << "]" << endl;
  • 计算程序运行的时间。
double t = (double)getTickCount(); t = ((double)getTickCount() - t)/getTickFrequency();

  • myImage.depth()得到除通道数外的其他参数。
  • myImage.channels(); 得到通道数。
  • myImage.type()得到所有的参数,包括字长类型和通道数。
CV_Assert(myImage.depth() == CV_8U); const int nChannels = myImage.channels(); Result.create(myImage.size(),myImage.type());

filter2d() 的用法
#include #include #include #include using namespace std; using namespace cv; int main(int argc, char** argv) { const char* filename = argc >= 2 ? argv[1] : "../sc2-3.jpg"; Mat src, dst1; if (argc >= 3 && !strcmp("G",argv[2])) src = https://www.it610.com/article/imread(filename, IMREAD_GRAYSCALE); else src = imread(filename, IMREAD_COLOR); if (src.empty()) { cerr <<"Can not open the file [" << filename << "]" << endl; return -1; }Mat kernel = (Mat_(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); namedWindow("input", WINDOW_AUTOSIZE); namedWindow("output", WINDOW_AUTOSIZE); imshow("input", src); double t = (double)getTickCount(); filter2D(src, dst1, src.depth(), kernel); t = ((double)getTickCount() - t)/getTickFrequency(); cout << "Built-in filter2D time passed in seconds:" << t << endl; imshow( "output", dst1 ); waitKey(0); }

效果
原图C++基础|opencv学习笔记(1)
文章图片

处理后的图像C++基础|opencv学习笔记(1)
文章图片

可以看到,边缘增强。

    推荐阅读