Recherche sur la détection d'images et la reconnaissance de feuilles de réponses basées sur Matlab

        L'examen est un moyen important de mesurer l'éducation, et c'est aussi un moyen important de sélectionner les talents à l'heure actuelle. Par conséquent, l'équité et la justice sont très importantes, ce qui se reflète non seulement dans le processus d'examen, mais également dans le processus de notation. Dans le passé, ces épreuves étaient revues et corrigées manuellement, le niveau, l'état et l'humeur de l'enseignant qui notait les épreuves pouvant affecter les résultats des épreuves.Cette incertitude était injuste et juste. Avec le développement continu des technologies de l'information et le renforcement continu des fonctions informatiques, des équipements de notation informatique pour les feuilles de réponses sont apparus.Grâce à la technologie de numérisation électronique, les feuilles de réponses papier sont converties en formes numériques, puis évaluées automatiquement.Cela résout non seulement le problème Les exigences d'équité et d'exactitude de la notation améliorent également l'efficacité de la notation.

        À l'heure actuelle, il existe deux façons principales d'identifier les cartes de réponse : l'une est basée sur un équipement photoélectrique et l'autre sur la technologie de traitement d'image. Le lecteur de curseur (OMR) convertit la capacité photosensible de différentes régions en signaux électriques traités par l'ordinateur en fonction de l'équipement photoélectrique, puis reconnaît en fonction des signaux électriques. Ce système d'identification présente les avantages d'une efficacité élevée, d'une grande précision et d'une faible consommation d'énergie, mais ses défauts sont également très importants, c'est-à-dire qu'il doit utiliser une machine de marquage de curseur et une carte de réponse spéciale, et le coût d'achat et le coût d'utilisation sont très élevé, et ce genre de Une fois le format de la feuille de réponses est déterminé, il est difficile à modifier, et le champ d'application est faible. La technologie de traitement d'images consiste à utiliser l'image obtenue par le dispositif d'acquisition d'images pour l'analyse informatique et l'identification, de manière à obtenir des informations efficaces sur la feuille de réponses. Cette méthode d'identification peut non seulement compléter le travail de correction, mais présente également les avantages d'un faible coût et d'une utilisation pratique, et la structure de la feuille de réponses peut être facilement modifiée via un logiciel pour s'adapter aux différents besoins.

analyse de la demande

  1. Identifier les options de réponse de la feuille de réponses
  2. Comparer avec la bonne réponse
  3. Identifier et calculer les scores
  4. Écrire les résultats dans un fichier Excel
  5. Près de 100 % de taux de reconnaissance

Ce papier réalise 

  • Prétraitement - niveaux de gris, binarisation, etc.
  • Correction d'inclinaison - Transformée de Hough
  • Correction de distorsion - détection de coin, transformation de projection
  • Faible taux de fausses reconnaissances, positionnement précis des traces de remplissage
  • Le résultat de la détection de la cible est comparé à la réponse standard et le résultat de l'analyse est donné

Code

img_path_list = dir(strcat(file_path,'*.jpg'));%获取该文件夹中所有jpg格式的图像  
img_num = length(img_path_list);%获取图像总数量 
errno = 0;%错误代码,0表示无误
if img_num > 0 %有图像
    for k = 1:img_num %逐一读取图像  
        image_name = img_path_list(k).name;% 图像名  
        image =  imread(strcat(file_path,image_name));  
        %I{j}=image;
        fprintf('%s\n',strcat(file_path,image_name));
        
       %% 识别过程
        %预处理
        SHOW=1;
        if numel(image)>2
          gray=rgb2gray(image);%用灰度化函数灰度化
            %自定义灰度化,由于红色的干扰比较大,因此降低红色通道的比重
            R = image(:,:,1);  %通道R
            G = image(:,:,2);  %通道G
            B = image(:,:,3);  %通道B
            gray = (G.*0.45 + B.*0.45 + R.*0.10);%降低R通道权重
        else
            gray=image;
        end
        %滤波与二值化
        g_bw = imbinarize(gray).*1.0;
        Low_High = stretchlim(g_bw, [0.0 0.3]);
        enmed= imadjust(g_bw, Low_High, [ ]);%对比度增强
        med = medfilt2(enmed, [7 5]);%中值滤波
        gausFilter = fspecial('gaussian',[5 5],10);   %高斯滤波器
        blur=imfilter(med,gausFilter,'replicate'); %高斯滤波
        
        bw = imbinarize(blur, max(0.2,graythresh(blur)-0.2));%im2bw
        if SHOW
            figure(),subplot(121),imshow(image);title('原图');
            subplot(122),imshow(gray);title('灰度图');
            figure('name','预处理过程');
            subplot(2, 2, 1);imshow(enmed);title('对比度增强');
            subplot(2, 2, 2);imshow(med);title('中值滤波');
            subplot(2, 2, 3), imshow(blur), title('高斯平滑');
            subplot(2, 2, 4), imshow(bw), title('二值化');
        end
        %% 定位感兴趣区域
        SHOW=1;
        e_in=bw;
        e_in_gray=gray;
        edged_img=edge(e_in,'canny');%边缘检测
        S1 = regionprops(edged_img,'BoundingBox','PixelIdxList');
        max_area = 0;
        for i = 1:length(S1)%寻找最大BoundingBox
            area = S1(i).BoundingBox(3)*S1(i).BoundingBox(4); 
            if area>max_area
               max_area = area;
               pos = i;
            end
        end
        bbox = round(S1(pos).BoundingBox);
        bbox(3:4)=bbox(3:4) + 1;
        e_in_new(S1(pos).PixelIdxList)=1;
        CNT_ROI=e_in_new(bbox(2):bbox(2)+bbox(4)-1,bbox(1):bbox(1)+bbox(3)-1);
        if SHOW
            figure('name','边缘检测'),imshow(edged_img);
            figure('name','ROI');
            subplot(1,2,1);
            imshow(ROIofbw);title('感兴趣区域二值图');
            subplot(1,2,2);imshow(CNT_ROI);title('感兴趣区域轮廓');
            imwrite(CNT_ROI,'./refer/CNT_ROI.jpg');
        end
        %% 倾斜校正 使用hough直线检测
        SHOW = 1;%控制是否显示中间过程
        %输入参数
        ROIofBW = ROIofbw;
        [H,Theta,Rho] = hough(CNT_ROI);
        [hight,width]=size(CNT_ROI);
        if length(lines)==1
            rotate_angle=lines.theta;%求旋转角
        else
            rotate_angle=lines(pos).theta;%求旋转角
        end
        rotated_ROIofBW = imrotate(ROIofBW,rotate_angle);
        rotated_ROI_ORI = imrotate(ROI_ORI,rotate_angle);%####ORI
        rotated_CNT_ROI = imrotate(CNT_ROI,rotate_angle);
        if SHOW
            figure,subplot(121),imshow(ROIofBW);title('倾斜校正前');
            hold on
            xy = [lines(pos).point1; lines(pos).point2];
            plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','r');
            hold off;
            subplot(122),imshow(rotated_ROIofBW);title('倾斜校正后');
            imwrite(rotated_ROIofBW,'refer/rotated_ROIofBW.jpg')
        end
end

 

 Pour un code détaillé et d'autres informations, veuillez cliquer sur : 134-170-3358 ;

Je suppose que tu aimes

Origine blog.csdn.net/Jiangtagong/article/details/123686332
conseillé
Classement