OpenCV入门教程(9)- 图片按照对角线分割

来源:互联网 发布:js 获取滚动条位置 编辑:程序博客网 时间:2024/05/24 06:53

最近在学习OpenCV,在网上看到@星沉阁冰不语的博客,里面有一篇文章讲解方形图片按对角线分割,但是没有实现矩形图片的分割。作为学习的巩固,实现以巩固之。
代码是在其基础之上修改的,在此谢谢@星沉阁冰不语。下面我们开始看代码,一些讲解直接注释在代码里了。

#include <QCoreApplication>#include <iostream>#include <cstdlib>#include "opencv2/core/core.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"using namespace std;using namespace cv;int main(){    // 读取要处理的图像文件    Mat src = imread("lyc.jpg", -1);    if(src.empty())    {        cout << "Can not load image." << endl;        return -1;    }    Mat dst1(src.rows, src.cols, CV_8UC3,Scalar::all(0));    Mat dst2(src.rows, src.cols, CV_8UC3,Scalar::all(0));    int x = src.rows;    int y = src.cols;    float slope = (float)y / (float)x;    for (int i = 0; i < src.rows; i++)    {        Vec3b *p = src.ptr<Vec3b>(i);        Vec3b *p1 = dst1.ptr<Vec3b>(i);        Vec3b *p2 = dst2.ptr<Vec3b>(i);        // 寻找列元素的起始位置        // 根据图片的斜率,确定列元素是从第几个像素开始。        float tmp = (float)i;        tmp = tmp * slope -(int)(tmp * slope);        int m = 0;        if(tmp >= 0.5)            m = (int)(i * slope) + 1;        else            m = (int)(i * slope);        for (int j = m; j < src.cols; j++)        {            p1[j] = p[j];        }        for (int k = 0; k < m; k++)        {            p2[k] = p[k];        }    }    Point a = Point(0, 0);    Point b = Point(src.cols, src.rows);    line(src, a, b, Scalar(255, 255, 0),1);    imshow("src", src);    imshow("dst1", dst1);    imshow("dst2", dst2);    waitKey(0);    return 0;}

该代码使用指针进行像素矩阵的操作,效率必at()函数和迭代函数要高。
源图片如下,像素是500*375:
这里写图片描述
分割后,对角线上面图像为:
这里写图片描述
分割后,对角线下面图像为:
这里写图片描述

欢迎大家指正!

0 0
原创粉丝点击