NDK 之C++篇开篇
今天是NDKC++篇的第一课,当然也会讲很多的C的相关知识.有一件事需要提前跟大家说声抱歉,讲完这节课NDK可能需要暂停一段时间(大概一个半月).
为什么呢?因为之前写的两篇文章访问量并不高,好多人也向我反应没有干货.我当然不能否认,因为在写之前做的准备的确不多,之后的一段时间我会抽时间然后给大家准备更精彩的内容,不过我还是会不定期的给大家更新一些android原生的东西.希望大家都能有所收货吧.
下面是C++篇的重要部分—OpenCV的第一课,也是我将要开始的NDK中的主线内容.
OpenCV
关于OpenCV的基础知识,以及它的诸多背景这里我不在多说,因为这些东西对与程序员是很容易找到的,关于OpenCV的安装和环境配置有兴趣研究的同学可以在最下方加我的qq联系.
OpenCV图像的形态学操作 – 膨胀(erode)与腐蚀(dilate)
形态学操作:
基于形状的一系列图像处理操作,通过将结构元素作用于输入图像产生输出图像.(我不太擅长总结,所以智能直接把翻译者给的定义拿过来了)
而形态学最简单的操作就是膨胀与腐蚀
膨胀
•
此操作将图像 A 与任意形状的内核 (B),通常为正方形或圆形,进行卷积。
•
内核 B 有一个可定义的 锚点, 通常定义为内核中心点。
•
进行膨胀操作时,将内核 B 划过图像,将内核 B 覆盖区域的最大相素值提取,并代替锚点位置的相素。显然,这一最大化操作将会导致图像中的亮区开始”扩展” (因此有了术语膨胀 dilation )。对上图采用膨胀操作我们得到:
腐蚀
•
腐蚀在形态学操作家族里是膨胀操作的孪生姐妹。它提取的是内核覆盖下的相素最小值。
•
进行腐蚀操作时,将内核 B 划过图像,将内核 B 覆盖区域的最小相素值提取,并代替锚点位置的相素。
•
以与膨胀相同的图像作为样本,我们使用腐蚀操作。从下面的结果图我们看到亮区(背景)变细,而黑色区域(字母)则变大了。
下面的图像的形状变画丢应上面的膨胀与腐蚀
* 注意**
图像的腐蚀与膨胀与图像的放大和缩放是完全不同的概念
因为图像的膨胀和腐蚀是对关键区域的像素进行处理过的,动图中图片在进行缩放和腐蚀的时候,实际上的背景是没有任何变化的.(只不过因为背景是白色看不出来而已)
代码
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<highgui.h>
#include<stdio.h>
#include<stdlib.h>
using namespace cv;
int erosion_size = 0;
int dilation_size = 0;
int const max_kernel_size = 21;
Mat src, dst_diolate, dst_erosion;
void Dilation(int, void*);
void Erosion(int, void*);
int main(int argc, char* argv[])
{
src = imread("hope.jpg");
namedWindow("Dilation Demo", CV_WINDOW_AUTOSIZE);
namedWindow("Erosion Demo", CV_WINDOW_AUTOSIZE);
cvMoveWindow("Dilation Demo", src.cols, 0);
cvMoveWindow("Erosion Demo", src.cols, 0);
/// 创建膨胀 Trackbar
createTrackbar("我要膨胀", "Dilation Demo",
&dilation_size, max_kernel_size,
Dilation);
createTrackbar("我要膨胀", "Erosion Demo",
&erosion_size,max_kernel_size,
Erosion);
Dilation(0,0);
Erosion(0, 0);
imshow("src", src);
waitKey();
return 0;
}
void Dilation(int, void*)
{
// dst = Mat::zeros(src.size(), src.type());
int erosion_type = MORPH_CROSS;
Mat ele = getStructuringElement(erosion_type,
Size(2 * dilation_size + 1, 2 * dilation_size + 1),
Point(dilation_size, dilation_size));
dilate(src, dst_diolate, ele);
imshow("Dilation Demo", dst_diolate);
}
void Erosion(int, void*)
{
int erosion_type = MORPH_CROSS;
Mat element = getStructuringElement(erosion_type,
Size(2 * erosion_size + 1, 2 * erosion_size + 1),
Point(erosion_size, erosion_size));
///膨胀操作
erode(src, dst_erosion, element);
imshow("Erosion Demo", dst_erosion);
}
代码释义
imread 读图像
getStructuringElement 指定腐蚀操作的内核,默认为一个简单的3*3矩阵
dilate 膨胀操作
erode 腐蚀操作
代码的讲解比较简单,因为我觉得程序原理相通又比较短,容易理解,需要opencv Api文档的同学可以加我的qq.
联系我
QQ:1275054668
Email:pook216@163.com