2017-04-18 74 views
1

我已经从图像中提取了速度符号。 enter image description here当乘以一个整数得到一个矩阵?

然后,我用matlab中的ocr来检查右下图中的数字。答案是20.我然后将其添加到数组。当数组为disp(array)时,它应该显示20。 但我不能检查ismember,所以我开始disp其他选项。当我尝试disp(A*2)时,我得到的不是40,而是一个随机数字为100 158 20 20的数组。这是为什么?我怎样才能检查我原来从number=results.Text得到的答案是否是20或者是否有if语句? 我的代码:

I = imread('p7.tif'); 
subplot(2,2,1);imshow(I);title('Original Image'); 
%sharpen edges 
B = imsharpen(I); 
subplot(2,2,2);imshow(B);title('sharpened edges'); 

%find circles 
Img = im2bw(B(:,:,3)); 
minRad = 20; 
maxRad = 90; 
[centers, radii] = imfindcircles(Img, [minRad maxRad], ... 
            'ObjectPolarity','bright','sensitivity',0.87); 
imagesc(Img); 
viscircles(centers, radii,'Color','green'); 

rect = [centers(1)-(radii - radii/3.5),centers(2)-(radii - radii/3.5),2*(radii-radii/3.5),2*(radii-radii/3.5)]; 
I2 = imcrop(I,rect); 

subplot(2,2,3);imshow(I2);title('crop'); 
%to gray 
gray = rgb2gray(I2); 
Icorrected = imtophat(gray, strel('disk', 15)); 
black = im2bw(gray); 
results = ocr(black); 
number = results.Text; 

A = number; 
array = []; 
array = [array,A]; 
disp(array) 
%result is 20 


disp(A) 
%result is 20 

disp(A*2) 
%results is 100 158 20 20 

subplot(2,2,4);imshow(black);title('crop'); 

编辑: 由于A是一个字符串我试图做到这一点:

A = number; 
B = '20'; 
tf = strcmp(A,B) 

但是TF = 0 我怎么能检查A是20或不?

+1

'results.Text'不是一个数值数组,因此'disp(A)'显示的是'20',而不是'20'。将字符数组乘以整数将返回ASCII等效值。尝试'disp('hi'* 2)'。 – excaza

+0

我能否以某种方式检查A是否为20号?或者它包含数字2? – Powisss

回答

2

%的文档ocr ,退货是ocrText objectText财产是:

OCR识别的文本,指定为数组字符。该文本包括空白和换行符。

将字符数组乘以数字数组会将字符数组乘以数字(通常为ASCII等效)。你可以看到这一点:

>> disp('hi'*2) 
    208 210 

你的情况,你有'2O '而不是20,它可以与你的“随机”阵列中可以看出:

>> disp(char([100 158 20 20]/2)) 
2O 

注意,你已经匹配O和不是0,所以简单的str2double在这种情况下不起作用。有几个选项解决此问题:

如果你知道你只是在寻找的数字,你可以指定一个'CharacterSet'ocr所以它不会匹配的字母:

results = ocr(black, 'CharacterSet', ''); 
number = str2double(results.Text); 

否则,您可以建立一个替代字典交换他们的“等值”的字符。 MATLAB工具箱可能具有内置的功能,但我对工具箱不太熟悉。

0

您的代码A实际上是一个char数组'20'而不是标量20

当你做disp(A)它显示的字符'20',但是当你做disp(A*2)先将其转换A元素(['2','0'])为双([50 48]),然后乘以2:

A = '20'; 
disp(A) % 20 
disp(class(A)) % char 
A2 = A*2; 
disp(class(A2)) % double 
disp(A*2) % 100 96 
+0

谢谢你解释,现在有道理!有没有办法可以检查A是否包含20?那就是我的目标是什么,如果答案与符号相符,就可以得到“是”或“否”。 – Powisss

+0

str2double(A)== 20或strcmp(A,'20') – user2999345