import cv2 import numpy as np import tensorflow as tf from object_detection.utils import label_map_util from object_detection.utils import visualization_utils as vis_util
因为当时还在用 opencv-2.4.11,所以本文所实现的代码是基于 opencv-2.4.11,不过应该只要在 opencv-2.0 版本及以上只要有 Mat 数据结构的都能用,毕竟 Shaun 只用到了 OpenCV 中的 Mat 数据结构。Talk is cheap, show you the code(代码很乱,估计也只用这么一次,所以就没怎么注意了 :-P)。具体 C++ 实现代码为:
// ---------------- 鼠标事件回调函数 --------------------------------- static cv::Mat src_img; // 原始图像全局变量 staticvoidmouseCallback(int event, int x, int y, int flags, void *) { bool selected = false; static cv::Point left_top_vertex, right_down_vertex; // 左上角顶点和右下角顶点 // When the left mouse button is pressed, record its position and save it in corner1 if (event == CV_EVENT_LBUTTONDOWN) // 左键按下 { left_top_vertex.x = x; left_top_vertex.y = y; std::cout << "Corner 1 recorded at " << left_top_vertex << std::endl; } // When the left mouse button is released, record its position and save it in corner2 if (event == cv::EVENT_LBUTTONUP) // 左键弹起 { // Also check if user selection is bigger than 20 pixels (jut for fun!) if (abs(x - left_top_vertex.x) > 10 && abs(y - left_top_vertex.y) > 10) { right_down_vertex.x = x; right_down_vertex.y = y; std::cout << "Corner 2 recorded at " << right_down_vertex << std::endl << std::endl; selected = true; } else { std::cout << "Please select a bigger region" << std::endl; } } // Update the box showing the selected region as the user drags the mouse if (flags == CV_EVENT_FLAG_LBUTTON) // 左键拖拽 { cv::Point pt; pt.x = x; pt.y = y; cv::Mat local_img = src_img.clone(); rectangle(local_img, left_top_vertex, pt, cv::Scalar(0, 0, 255)); imshow("Cropping app", local_img); } // Define ROI and crop it out when both corners have been selected if (selected) { cv::Rect box; box.width = abs(left_top_vertex.x - right_down_vertex.x); box.height = abs(left_top_vertex.y - right_down_vertex.y); box.x = cv::min(left_top_vertex.x, right_down_vertex.x); box.y = cv::min(left_top_vertex.y, right_down_vertex.y); // Make an image out of just the selected ROI and display it in a new window cv::Mat crop(src_img, box); cv::namedWindow("Crop"); imshow("Crop", crop); } }
// ---------- 响应鼠标事件 ------------------------------------ voidsetMouseCallbackTest() { src_img = cv::imread("../data/lena.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); cv::namedWindow("Cropping app"); imshow("Cropping app", src_img); // Set the mouse event callback function cv::setMouseCallback("Cropping app", mouseCallback);
以上代理工具配置完成后,即可在 Chrome 中畅游 Internet 了,但是正确的科学式上网姿势应该是:国内的网站走本地连接,而国外被屏蔽的网站才走代理。这就需要 Proxy SwitchyOmega 这款插件了,它能按照一定的规则自动选择走本地还是走代理,这样既不会浪费流量,也能使国内的网站联网速度不受影响。导入前文推荐的配置文件后,就可选择对应的代理方式。这里当然是选择自动切换,至于虚拟切换是选择 Lantern for 8787 还是 XXNET for GAE 就随便个人的喜好了(在走代理的时候别忘了把相应的代理工具开启);如果直接选择其中一种代理方式就相当于全局代理,这也就失去这款插件的作用,只有自动切换加上虚拟切换才能充分发挥这款神器的真正作用。
匿名网络
要想使用匿名网络,当然少不了专用的浏览器:Tor Browser,下载并安装(下载时需要身处科学式网络环境,安装时最好改变一下目录,而且路径中最好不要有中文)。接下来就是配置了 Tor 网络了。具体配置流程如下:
首先,它问直接连接 Tor 网络还是配置网桥或代理,这里当然是选择配置;其次它问互联网服务提供商( ISP )是否对 Tor 网络连接进行了封锁或审查,这里选否,据枂下站长所说因为国内网桥大部分已失效,连接网桥没有意义还会拖慢速度;然后它问是否本地代理访问互联网,这里当然选择是;最后填写本地代理配置,这里需要注意,枂下站长提供的部分代理配置是:
最后再简要记录一下 Chrome 调用 Tor Browser 的代理吧。Shaun 没有像 枂下 站长那样用命令行去实验,只是享受了一下 ta 的试验成果(O(∩_∩)O谢谢)。总而言之,还是利用 SwitchyOmega,代理方式选择 Tor for 9150,就可以在 Chrome 中调用 Tor Browser 的代理,畅游 Internet 了。
※BTW:上次修改文章内a标签的高度后突然发现打赏的“赏”字背景圆形变成椭圆了 o(╯□╰)o,后面发现原来它也继承文章内 a 标签的属性,没有自己的 padding,后面只有给 .dashang 添加个独立的 padding: 8px;。
9、Fix Bugs
修改日期:2017-12-20
修复bug:鼠标悬浮 a 标签之上会出现显示 a 标签 title 内容的气泡,当 title 内容过多时,会造成气泡位置下调,从而遮住相应 a 标签内容的 bug。
解决方案为:定位气泡文件为主题文件夹下 \layout\_partial\post\TipTitle.ejs 文件,将其中气泡出现的位置改变,原来气泡的位置确定由 top 和 left 决定,现改为 bottom 和 left,毕竟气泡是出现在 a 标签上方,如果将 top 确定,则 title 内容过多时,其只能向下扩张,造成气泡位置下移现象,从而遮住原来的 a 标签内容,改为 bottom 确定之后,气泡只会向上扩张,气泡位置相对稳定,不会遮住原来的 a 标签内容。具体修改内容为,将 top: offset.top - a.outerHeight() - 15 替换为 bottom: window.innerHeight - offset.top + 10 ,其它内容保持不变。
修改日期:2017-12-26
BUG描述:由于 spfk 主题启用的是百度分享,而原作者没有为其添加邮件分享,Shaun 为了好玩就添加个邮件分享,但是在添加过程中,Shaun 发现了个 BUG,就是为其添加的 title 属性没有作用,它会自动更改 title 内容,而 spfk 主题有显示 title 的气泡 TipTitle,所以不需要用默认的东西显示 title 内容,但是,这个百度分享还是强制默认显示,TipTitle 并不能消除其 title 内容。
解决方案:定位百度分享强制添加 title 的代码,其位于主题文件夹下\source\static\api\js\view\share_view.js 中,具体代码如下:
1 2 3 4
function(e){ var i=e.partners,s=i[n]?"\u5206\u4eab\u5230"+i[n].name:""; !r(t).attr("title")&&s&&r(t).attr("title",s) }
var $iconToFold = $(".toc-item > .fa-caret-down"); var $iconToExpand = $(".toc-item > .fa-caret-right"); $iconToExpand.addClass("hide");
// --------------点击小图标-------------- var clickIcon = function () { $("#toc .toc-item > i").click(function () { $(this).siblings(".toc-child").slideToggle(100); $(this).toggleClass("hide"); $(this).siblings("i").toggleClass("hide"); }) }()
// 默认展开目录,所以隐藏掉表示“目录已展开”的图标(向下的小三角) var $iconToFold = $(".toc-item > .fa-caret-down"); $iconToExpand.addClass("hide");
// ------------点击大标题----------------- var clickTitle = function () { $titleHasChild.dblclick(function () { $(this).siblings(".toc-child").hide(100); $(this).siblings("i").toggleClass("hide"); }) // After dblclick enent $titleHasChild.click(function () { var $curentTocChild = $(this).siblings(".toc-child"); if ($curentTocChild.is(":hidden")) { $curentTocChild.show(100); $(this).siblings("i").toggleClass("hide"); } }) }()
// ---------点击总标题----------------- var clickTocTitle = function () { var $iconToExpand = $(".toc-item > .fa-caret-right"); var $iconToFold = $(".toc-item > .fa-caret-down"); var $subToc = $titleHasChild.next(".toc-child");