我目前正在使用Visual Studio上的Google API Vision编写分析图像的代码。 但是我在循环期间遇到了一个问题。 分析返回一个注释列表(汽车,车辆,陆地车辆等),我想用“if”过滤它,所以我写了这个:
var image = Google.Cloud.Vision.V1.Image.FromFile("C:\\temp\\sequence\\1.jpg");
var client = ImageAnnotatorClient.Create();
var response = client.DetectLabels(image);
CropHintsAnnotation confidence = client.DetectCropHints(image);
bool empty = false;
foreach (var annotation in response)
{
textBox1.Text += annotation.Description + "\r\n";
textBox1.Text += "Score : " + annotation.Score + "\r\n";
if (annotation.Description.Equals("vehicle"))
{
empty = false;
}
else
{
empty = true;
}
}
textBox1.Text += "\r\nEmpty ? " + empty + "\r\n\r\n";
所以,如果我写得好,它应该说“空?假”,因为分析返回“车辆”一次。 我还试图替换:
annotation.Description.Equals("vehicle")
通过
annotation.Description.Contains("vehicle") == true
但是没办法,它仍然说“空?真”,因为它不应该。
有什么想法吗?
提前感谢您阅读本文并寻求帮助!
答案 0 :(得分:2)
不完全确定您在此处尝试做什么,但假设response
有多个项目,empty
变量将仅代表最后一项的值。
原因是,当循环的每次迭代到达if
语句时,它将输入它或else
并且肯定会输入其中一个,因此对于每次迭代,值将分配empty
并覆盖之前的值
至于代码本身,以这种方式写它是更简洁的:
empty = !annotation.Description.Equals("vehicle");
你应该改变的是将分配线移动到循环中:
foreach(/*...*/)
{
/*...*/
empty = !annotation.Description.Equals("vehicle");
textBox1.Text += "\r\nEmpty ? " + empty + "\r\n\r\n";
}
答案 1 :(得分:1)
您是否考虑过返回字符串的情况?试着忽略这个案子:
annotation.Description.Equals("vehicle", StringComparison.InvariantCultureIgnoreCase)
只是旁注:Equals
函数返回Boolean
,因此您可以删除整个if
语句并将代码简化为:
empty = !annotation.Description.Equals("vehicle", StringComparison.InvariantCultureIgnoreCase)
答案 2 :(得分:0)
几种可能性:
你能检查一下车辆的顺序。也可能是它确实在索引0上找到车辆的描述,但是索引1不是车辆,因此它会覆盖先前的值。如果是这种情况,您可能希望在满足所需条件时退出循环。
foreach (var annotation in response)
{
// not sure if you want this to
textBox1.Text += annotation.Description + "\r\n";
textBox1.Text += "Score : " + annotation.Score + "\r\n";
if (annotation.Description.Equals("vehicle",
StringComparison.InvariantCultureIgnoreCase))
{
empty = false;
textBox1.Text += "\r\nEmpty ? " + empty + "\r\n\r\n";
//possibly also break if you've achieved what you want.
break;
}
}