opencv官方自带了人脸识别的模型,这里测试一下效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* 人脸识别测试
* @param args
*/
public static void main(String[] args) {
CascadeClassifier classifier = new CascadeClassifier("haarcascade_frontalface_alt.xml");

Mat image = Imgcodecs.imread("images/chuanpu.png");

MatOfRect faces = new MatOfRect();
classifier.detectMultiScale(image, faces);

Rect[] rects = faces.toArray();

System.out.println("识别人脸数:" + rects.length);
for (int i = 0; i < rects.length; i++) {
Imgproc.rectangle(image, new Point(rects[i].x, rects[i].y),
new Point(rects[i].x + rects[i].width, rects[i].y + rects[i].height), new Scalar(0, 0, 255), 1);
Imgproc.putText(image, "Human", new Point(rects[i].x, rects[i].y), Imgproc.FONT_HERSHEY_PLAIN, 1.0,
new Scalar(0, 255, 0), 1, Imgproc.LINE_AA, false);
}
imwrite("output/face2.png", image);
}

本文在边缘检测的基础上继续,即将上文边缘检测的结果(矩阵)输入,然后进一步发现轮廓并绘制
这里先将opencv库的加载设置为类的静态代码块,在相关方法代码体里面不再声明

1
2
3
4
5
6
7
8
static {		
try {
NativeLoader.loadLibrary(Core.NATIVE_LIBRARY_NAME);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

下面是轮廓绘制的相关方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 发现轮廓
* @param image
* @param onBlank
* @return
*/
static List<MatOfPoint> find_contours(Mat image, boolean onBlank) {
Mat imageBW = new Mat();

Imgproc.cvtColor(image, imageBW, Imgproc.COLOR_BGR2GRAY);
Imgproc.Canny(imageBW,imageBW,100.0,300.0,3, true);

List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Imgproc.findContours(imageBW, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_NONE);
return contours;

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static Scalar BLACK = new Scalar(0,0,0) ;
/**
* 绘制轮廓
* @param originalMat
* @param contours
* @param thickness
* @return
*/
static Mat draw_contours(Mat originalMat, List<MatOfPoint> contours, int thickness) {
Mat target =
new Mat(originalMat.height(), originalMat.width(), CvType.CV_8UC3, WHITE);

for (int i = 0; i < contours.size(); i++)
Imgproc.drawContours(target, contours, i, BLACK, thickness);

return target;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 发现及绘制轮廓
* @param args
*/
public static void main(String[] args) {

Mat kittens = imread("images/three_black_kittens.jpg");
List<MatOfPoint> contours = find_contours(kittens, true);

Mat target = draw_contours(kittens, contours, 7);
imwrite("output/kittens-contours-7.png", target);

Mat masked = mask_on_bg(target, "images/light-blue-gradient.jpg");
imwrite("output/kittens-masked.png", masked);

target = draw_contours(kittens, contours, 3);
imwrite("output/kittens-contours-3.png", target);
}

原图

处理后


下面是使用掩模的输出

1
2
3
4
5
6
7
static Mat mask_on_bg(Mat mask, String backgroundFilePath) {
Mat target = new Mat(mask.height(),mask.width(),CvType.CV_8UC3,WHITE);
Mat bg = imread(backgroundFilePath);
Imgproc.resize(bg, bg, target.size());
bg.copyTo(target, mask);
return target;
}

opencv是一个C++语言库,对于java程序员来说,貌似不是很友好;不过java程序员可以利用jni调用的方式来处理

for example:

1
2
3
4
5
6
7
8
9
10
public static void main1(String[] args) throws Exception {
NativeLoader.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat hello = Mat.eye(150, 150, CvType.CV_8SC3);
System.out.println(hello.dump());
hello.setTo(new Scalar(180,80,250));
Mat sub=hello.submat(0,50,0,50);
sub.setTo(new Scalar(0,0,100));
//imwrite("E:\\idea-workspace\\hellocv\\dev\\hello.png",hello);
//System.out.println(hello.dump());
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 边缘检测算子
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
NativeLoader.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat tools=Imgcodecs.imread("images/tools.jpg");
Imgproc.cvtColor(tools, tools, Imgproc.COLOR_RGB2GRAY);
Imgproc.Canny(tools, tools,100.0, 300.0,3,true);

Mat invetedTools=tools.clone();
bitwise_not(invetedTools, invetedTools);
Imgcodecs.imwrite("output/tools-04.png", invetedTools);
}


图像掩模

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
static Scalar WHITE = new Scalar(255,255,255);
/**
* 图像掩模
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {

NativeLoader.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Mat kittens = imread("images/tools.jpg");

Imgproc.cvtColor(kittens, kittens, Imgproc.COLOR_RGB2GRAY);
Imgproc.Canny(kittens, kittens, 100.0, 300.0, 3, true);
bitwise_not(kittens, kittens);
// System.out.println(kittens.dump());

Mat target = new Mat(kittens.height(), kittens.width(), CvType.CV_8UC3, WHITE);
Mat bg = imread("images/light-blue-gradient.jpg");
Imgproc.resize(bg, bg, target.size());
bg.copyTo(target, kittens);

imwrite("output/kittens-03.png", target);
}

最近网易公开课的视频接口做了修改,貌似没有提供m3u8文件地址,因此不能像以前可以下载高清视频

不过现在提供了部分视频的中英文字幕地址(需要解析),如果下载到本地,需要自己处理文件合并与同步,以及时间延迟等问题

折腾了一会,终于搞定,以后可以自己勘误本地字幕文件

比如信号处理视频的字幕文件,本人已下载并合并,并调整了时间延迟,确保跟下载视频文件同步


在古汉语中,词类活用是一种较为普遍的语法现象,如形容词作动词、名词作动词、名词作状语等

以往的语言教学对这些词类活用现象,诸如解释为意动用法、使动用法等,解释比较笼统

形容词作动词,使动用法

例句:

1)春风又绿江南岸
2)白了少年头
3)红了樱桃,绿了芭蕉
4) 富润室,德润身,心广体胖,故君子必诚其意

传统语法将上面的句子中的形容词作动词,通常解释为使动用法;这个解释当然没有问题,不过本人觉得还是解释得比较笼统

如果参考动词框架语言及卫星框架语言中的分析,上述语法现象可以考虑进一步解释

词类活用现象,它相当于补充了动作之外的其他信息,诸如原因、效果、方式、处所等

形容词作动词,即使动用法,它通常表示动作+效果

上面的句子貌似为致使事件,与位移事件具有同源性,即都表示状态的变化;

形容词作动词,意动用法

例句:

5)然则吾大天地而小豪末,可乎?《庄子》
6)吾妻之美我者,私我也;妾之美我者,畏我也;客之美我者,欲有求于我也。《战国策·齐策》
7)是故明君贵五谷而贱金玉《论贵粟疏》
8)甘其食,美其服,安其居,乐其俗《老子》

上面句子传统解释为意动用法,亦可解释为动作+效果

名词用作动词,通常表示方式、工具、处所等

9)左右欲刃相如《史记》
10)卒中往往语,皆指目陈胜《史记》
11)假舟楫者,非能水也《荀子》
12)策之不以其道《马说》

名词作状语,则似乎更明显

13)天下云集响应,赢粮而景从《过秦论》
14)嫂蛇形匍匐《战国策·秦策》
15)君为我呼入,吾得兄事之《史记·项羽本纪》
16)叩石垦壤,箕畚运于渤海之尾《列子·汤问》
17)妾在巫山之阳,高丘之岨,旦为行云,暮为行雨,朝朝暮暮,阳台之下《高唐赋》

名词作状语,通常表示方式、工具、时间、处所等

……

在语言学中,从C·J·Fillmore的格语法到框架语义学,相对乔姆斯基的生成语法,对语言的语义方面做了进一步的研究;

而其缺点在于,认为语法只是表现语义的形式,相同的语义用不同的语法形式表示;即将语法视为被动的形式,而忽视其对语义的影响

现代认知语言学根据语法原型及图像背景等理论,语法实际是不同语言基于其原型的表现形式,以及不同的注意焦点等,因而表现了不同的语义

认知语言学家talmy认为,在位移事件中,包含四中基本概念要素,即图像(figure)、背景(ground)、位移(motion)、 路径(path)

根据路径表示的不同,将语言分为动词框架语言与卫星框架语言;

  1. 动词包含路径,称之为动词框架语言

  2. 动词不包含路径(路径由小品词表示),则称之为卫星框架语言

(由是观之,传统的格语法等,基于机械的语义匹配的语义格,恐怕有其不妥之处)

例句:

1)石头滚了下来
2)六鷁退飞过宋都
3)她把秘密藏在心里
4)大哥,你想开着点,……不必紧自往死牛犄角里钻
5)The pencil rolled off the table
6)The pencil lay on the table
7)The ball rolled down the hill
8)The napkin blew off the table

1)“滚”表示位移+方式,“下”表示路径;3)“roll”表示位移+方式,“off”表示路径

通常,在位移事件中,如果位移动词表示动作+方式,则需补充小品词表示路径;同样,如果位移动词表示动作+路径,则方式、原因等需要补充其他词表示

9)南宮适出,子曰:“君子哉若人!尚德哉若人!”《论语》
“出”表示位移+路径
10)鸟见之高飞,麋鹿见之决骤《庄子》
“骤”表示位移+方式
11)孔子下车而前,见谒者曰:“鲁人孔丘,闻将军高义,敬再拜谒者”《庄子·盗跖》
“前”表示位移+路径
12)诸侯之师败郑徒兵,取其禾而还《左传》
“还”表示位移+路径

……

本人认为,关于动词框架语言与卫星框架语言的分析思路,如果不限定位移事件的分析,可以扩展到其他事件,比如致使事件的分析中(貌似位移事件与致使事件具有同源性,即基于同一原型框架)

通常在致使事件中,其动词也不单纯具有表示动作的功能,而往往兼具有其他语义信息,诸如原因、工具、效果等

……

以下是现代汉语语料库中,与“看”有关的语句,列举数例如下:

1a. 我看见她走了过来,脸上挂着两行泪痕
1b. 因为我知道,这将是我最后一次看见她。眼中不住的淌出的热泪。
1c. 可说是只看见了结果,却没看见过程。
1d. 在黄叶一样的茶中,我们似乎看见了一位宗师的婆心,看见了生活,也看见了生命的滋味。

2a. 因居高临下,看清了还有条岔路通往右边的山傍。
2b. 在晚上我们可以看清浩瀚的星海。
2c. 这样你就能以明亮之眼去看清生活、工作和生命的真实面。
2d. 头脑清楚的人终于慢慢看清了事实。

后面几个例子中的“看”已经超出了生理视觉意义,引申有抽象的思维或理解之语言。我们可以将其归类为“理解是见”的概念隐喻。

英文中也有类似的隐喻现象:

  1. I see what you’re saying.(我明白你的话)
  2. It looks different from my point of view.(我的观点不同)
  3. What is your outlook?(你的观点(看法)是什么?)

下面是引自古汉语文献中的语句及词汇:

《论语》“父在,观其志”、“观过,斯知仁矣”
《老子》“涤除玄览,能无疵乎?” 、“致虚极,守静笃,万物并作,吾以观复”
”观念“、”观点“、”看法“、”看懂“、”见解“、”正见“、”邪见“、”慧眼“、”法眼“、“眼界”、”青睐“、”一心三观“、”法界观“、”应作如是观“

参考《觀念與味道:中國思想文獻中的概念譬喻管窺》