我有一个输入字段,显示自定义下拉菜单.我想要以下功能:
这是我的实现:
输入字段有一个onblur()
事件,innerHTML
只要用户在输入字段外单击,就会删除菜单(通过将其父项设置为空字符串).菜单中的div也有onclick()
执行特殊处理的事件.
问题是onclick()
单击菜单时事件永远不会触发,因为输入字段onblur()
首先触发并删除菜单,包括onclick()
s!
我解决了这个问题,将菜单div onclick()
分成' onmousedown()
和onmouseup()
事件,并在鼠标按下时设置一个全局标志,鼠标向上清除,类似于本答案中的建议.因为onmousedown()
之前触发onblur()
,onblur()
如果单击其中一个菜单div ,则会设置标志,但如果屏幕上的其他位置没有,则不会.如果单击菜单,我立即返回onblur()
而不删除菜单,然后等待onclick()
触发,此时我可以安全地删除菜单.
有更优雅的解决方案吗?
代码看起来像这样:
<div class="menu" onmousedown="setFlag()" onmouseup="doProcessing()">...</div>
<input id="input" onblur="removeMenu()" ... />
var mouseflag;
function setFlag() {
mouseflag = true;
}
function removeMenu() {
if (!mouseflag) {
document.getElementById('menu').innerHTML = '';
}
}
function doProcessing(id, name) {
mouseflag = false;
...
}
Run Code Online (Sandbox Code Playgroud) 我通过将前置摄像头设置为AVD Manager中的"webcam0"将网络摄像头连接到我的仿真器.当我启动模拟器的相机应用程序时,我收到错误
CameraService::connect X (pid 702) rejected (invalid cameraId 0).
Run Code Online (Sandbox Code Playgroud)
这是Android源代码的相关部分:
sp<ICamera> CameraService::connect(
const sp<ICameraClient>& cameraClient, int cameraId) {
int callingPid = getCallingPid();
[...]
if (cameraId < 0 || cameraId >= mNumberOfCameras) {
LOGE("CameraService::connect X (pid %d) rejected (invalid cameraId %d).",
callingPid, cameraId);
return NULL;
}
[...]
}
Run Code Online (Sandbox Code Playgroud)
网络摄像头已正确分配ID为0,因为只有1个摄像头.但是,mNumberOfCameras
大概仍为0.这意味着摄像机正在由仿真器注册,但它并没有费心去更新连接的摄像机的数量.
如何连接网络摄像头以便模拟器正确识别?
编辑:命令emulator -webcam-list -avd <name of your AVD>
in \android-sdks\tools
给出结果:
List of web cameras connected to the computer:
Camera `webcam0` is connected to device `AndroidEmulatorVC0` on channel …
Run Code Online (Sandbox Code Playgroud) 什么是快速可靠的阈值图像可能模糊和不均匀亮度的方法?
示例(模糊但亮度均匀):
由于不保证图像具有均匀的亮度,因此使用固定阈值是不可行的.自适应阈值可以正常工作,但由于模糊,它会在特征中产生断裂和扭曲(这里,重要的特征是数独数字):
我也尝试过使用直方图均衡(使用OpenCV的equalizeHist
功能).它可以增加对比度而不会降低亮度差异.
我发现的最佳解决方案是将图像按其形态结束(信用到此帖子)来划分,使亮度均匀,然后重新归一化,然后使用固定阈值(使用Otsu算法选择最佳阈值水平):
以下是OpenCV for Android中的代码:
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(19,19));
Mat closed = new Mat(); // closed will have type CV_32F
Imgproc.morphologyEx(image, closed, Imgproc.MORPH_CLOSE, kernel);
Core.divide(image, closed, closed, 1, CvType.CV_32F);
Core.normalize(closed, image, 0, 255, Core.NORM_MINMAX, CvType.CV_8U);
Imgproc.threshold(image, image, -1, 255, Imgproc.THRESH_BINARY_INV
+Imgproc.THRESH_OTSU);
Run Code Online (Sandbox Code Playgroud)
这很有效,但关闭操作非常慢.减小结构元素的尺寸会增加速度但会降低精度.
编辑:根据DCS的建议,我尝试使用高通滤波器.我选择了拉普拉斯滤波器,但我希望Sobel和Scharr滤波器具有相似的结果.滤波器在不包含特征的区域中拾取高频噪声,并且由于模糊而遭受与自适应阈值类似的失真.它也需要与关闭操作一样长.以下是15x15过滤器的示例:
编辑2:根据AruniRC的回答,我使用建议的参数在图像上使用Canny边缘检测:
double mean = Core.mean(image).val[0];
Imgproc.Canny(image, image, 0.66*mean, 1.33*mean);
Run Code Online (Sandbox Code Playgroud)
我不确定如何可靠地自动微调参数以获得连接的数字.
我需要将图像旋转90度,180度或270度.在OpenCV4Android中我可以使用:
Imgproc.getRotationMatrix2D(new Point(center, center), degrees, 1);
Imgproc.warpAffine(src, dst, rotationMatrix, dst.size());
Run Code Online (Sandbox Code Playgroud)
但是,这是我的图像处理算法的一个巨大瓶颈.当然,通过90度的倍数的简单旋转比最一般的情况简单得多warpAffine
,并且可以更有效地完成.例如,对于180度,我可以使用:
Core.flip(src, dst, -1);
Run Code Online (Sandbox Code Playgroud)
其中-1表示翻转水平轴和垂直轴.是否有类似的优化我可以用于90或270度旋转?
在res/values-v11/styles.xml
,我无法使用,Theme.Holo.Light.NoActionBar
因为它是在API级别13中添加的.我可以使用Theme.Light.NoTitleBar
,而没有视觉差异吗?据我所知,他们应该都有白色背景,状态和导航栏,没有别的.
在Visual Studio 2012中单步执行以下示例代码时:
std::vector<int> test;
test.resize(1);
test[0] = 4;
Run Code Online (Sandbox Code Playgroud)
我可以设置一个测试手表并检查它的第0个元素.但是,如果我在test [0]上设置一个监视器,我会得到错误'no operator"[]"匹配这些操作数':
如何直接检查test [0]的值?
要创建自定义ToggleButton,我在以下位置定义了一个新样式/res/values/styles.xml
:
<style name="myToggleButton">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">#000000</item>
<item name="android:background">@drawable/my_toggle_button</item>
</style>
Run Code Online (Sandbox Code Playgroud)
然后我使用选择器指定按钮状态的外观/res/drawable/my_toggle_button.xml
:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true">
<shape>
[...]
</shape>
</item>
<item android:state_checked="false"
<shape>
[...]
</shape>
</item>
</selector>
Run Code Online (Sandbox Code Playgroud)
当状态发生变化时,如何修改此设置以切换按钮的文本颜色?
该文档为OpenCV的的floodfill功能状态:
该函数使用并更新掩码,因此您负责初始化掩码内容.洪水填充不能跨越掩码中的非零像素.例如,边缘检测器输出可以用作掩模以停止在边缘处填充.可以在对函数的多次调用中使用相同的掩码,以确保填充区域不重叠.
该功能如何更新掩码?它是否将填充中的所有像素设置为某个非零值?
为什么list(next(iter(())) for _ in range(1))
返回一个空列表而不是提高StopIteration
?
>>> next(iter(()))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> [next(iter(())) for _ in range(1)]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> list(next(iter(())) for _ in range(1)) # ?!
[]
Run Code Online (Sandbox Code Playgroud)
使用显式引发的自定义函数也会发生同样的事情StopIteration
:
>>> def x():
... raise StopIteration
...
>>> x()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in x
StopIteration …
Run Code Online (Sandbox Code Playgroud) 我有一个相当模糊的数独谜题的432x432图像,其自适应阈值不好(取5x5像素的块大小,然后减去2):
正如你所看到的,数字略有扭曲,其中有很多破损,而且有5s融入6s和6s融入8s.此外,还有很多噪音.为了修复噪声,我必须使用高斯模糊使图像更加模糊.然而,即使是相当大的高斯内核和自适应阈值blockSize(21x21,减去2)也无法消除所有断点并将数字融合在一起甚至更多:
我还尝试在阈值处理后扩展图像,这与增加blockSize有类似的效果; 并且锐化图像,这在某种程度上没有太大作用.我还应该尝试什么?
opencv ×4
android ×3
threshold ×2
android-xml ×1
c++ ×1
flood-fill ×1
for-loop ×1
iterator ×1
javascript ×1
onblur ×1
onclick ×1
python ×1
rotation ×1
togglebutton ×1
vector ×1