1

Я пытаюсь подсчитать количество вкладок на скриншоте, используя OpenCV. Сначала я обрезал свое изображение, чтобы ограничить хромированные вкладки. Затем я использовал обнаружение кромок, алгоритм Canny для поиска краев в хроме. Затем я использую Houghlines, чтобы найти количество вкладок, но я не получаю необходимый вывод через Houghlines. Ниже приведен код и вывод.Как подсчитать количество вкладок в скриншоте, используя OpenCV houghlines?

import cv2 
import numpy as np 
import math 
from matplotlib import pyplot as plt 
img = cv2.imread('1.png') 

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
edges = cv2.Canny(gray,50,200,apertureSize = 3) 
cv2.imwrite('result.png',edges) 
lines = cv2.HoughLines(edges,1,np.pi/180,50) 

for rho,theta in lines[0]: 
    slope = 180*theta*1.0/np.pi 
    if slope > 110 and slope <148: # for identifying chrome tab angle (right slope line of each tab) 
    a = np.cos(theta) 
    b = np.sin(theta) 
    x0 = a*rho 
    y0 = b*rho 
    x1 = int(x0 + 1000*(-b)) 
    y1 = int(y0 + 1000*(a)) 
    x2 = int(x0 - 1000*(-b)) 
    y2 = int(y0 - 1000*(a)) 
    cv2.line(img,(x1,y1),(x2,y2),(0,0,255),3) 
cv2.imwrite('result2.png',img) 

Original cropped image Final Image

Firefox image

enter image description here

ответ

5

Очень интересно: D Действительно простое решение было бы бинаризации изображение и определить линию в верхней области изображения и получить значения серого. Тогда вы можете считать пересечения. Вот пример: Finding number of tabs from gray value profile

Необычные алгоритмы всегда являются лучшим решением. Определите, что вы хотите сделать, и попытайтесь найти решение как можно проще.

Вот мое решение в C++. Быстрая и грязный;)

#include "opencv2/imgproc.hpp" 
#include "opencv2/highgui.hpp" 
#include <vector> 
#include <stdlib.h> 
#include <stdio.h> 

using namespace cv; 
using namespace std; 

Mat src, binary, morph, gray, morph_rgb; 

/** 
*Compute number of tabs 
*/ 
int getNumberOfTabs(Mat& src, int start_col, int stop_col, int search_row, bool draw=false); 

/** 
* @function main 
*/ 
int main(int argc, char** argv) 
{ 
    const int morph_size = 2; 
    const int start_col = 5; 
    const int stop_col = 1750; 
    const int row_index = 2; 
    /// Load an image 
    src = imread("C:\\Users\\phili\\Pictures\\Tab.png", 1); 

    //Convert for binarization 
    cvtColor(src, gray, CV_RGB2GRAY); 
    threshold(gray, binary, 164, 255, 1); 

    //Remove icons and text on tabs 
    Mat element = getStructuringElement(CV_SHAPE_RECT, Size(2 * morph_size + 1, 2 * morph_size + 1), Point(morph_size, morph_size)); 
    morphologyEx(binary, morph, CV_MOP_OPEN, element); 

    int nmb_tabs = getNumberOfTabs(morph, start_col, stop_col, row_index, true); 

    imshow("Original", src); 
    imshow("Binary", binary); 
    imshow("Binary", morph); 


    /// Wait until user finishes program 
    while (true) 
    { 
     int c; 
     c = waitKey(20); 
     if ((char)c == 27) 
     { 
      break; 
     } 
    } 

} 

int getNumberOfTabs(Mat& src,int start_col,int stop_col, int row_index, bool draw) 
{ 
    int length = stop_col - start_col; 

    //Extract gray value profil 
    Mat profil = cv::Mat(0, length, CV_8U); 
    profil = src.colRange(start_col, stop_col).row(row_index); 

    Mat src_rgb; 
    if (draw) 
    {  
     cvtColor(src, src_rgb, CV_GRAY2RGB); 
     line(src_rgb, Point(start_col, row_index), Point(stop_col, row_index), Scalar(0, 0, 255), 2); 
    } 

    //Convolve profil with [1 -1] to detect edges 
    unsigned char* input = (unsigned char*)(profil.data); 
    vector<int> positions; 
    for (int i = 0; i < stop_col - start_col - 1; i++) 
    { 
     //Kernel 
     int first = input[i]; 
     int second = input[i + 1]; 
     int ans = first - second; 

     //Positiv or negativ slope ? 
     if (ans < 0) 
     { 
      positions.push_back(i + 1); 
      if(draw) 
       circle(src_rgb, Point(i + start_col, row_index), 2, Scalar(255,0, 0), -1); 
     } 
     else if (ans > 0) 
     { 
      positions.push_back(i); 
      if (draw) 
       circle(src_rgb, Point(i + start_col + 1, row_index), 2, Scalar(255,0, 0), -1); 
     } 

    } 
    if (draw) 
     imshow("Detected Edges", src_rgb); 
    //Number of tabs 
    return positions.size()/2; 
} 

и результаты с поисковой строкой в ​​красном и обнаруженных краях в синем: enter image description here

+0

Эй. Я новичок в этой теме. Можете ли вы рассказать мне, что вы сделали, чтобы развить изображение? У меня есть наборы изображений. Я хотел найти среднее количество вкладок всех изображений –

+1

Я использовал [ImageJ] (https://imagej.nih.gov/ij/). Это инструмент для обработки изображений с открытым исходным кодом. Вы можете проверить некоторые идеи без необходимости создавать новые проекты, ...! [Здесь] (https://imagingbook.com/source/) вы можете загрузить некоторые полезные плагины. Но в основном я преобразовал изображение в 8 бит, используя глобальный порог (см. Гистограмму 8-битного изображения) и выполнил бинаризацию. В OpenCV вы можете загрузить изображение с флагом 'CV_LOAD_IMAGE_GRAYSCALE' или преобразовать цветное изображение с помощью' cv2.cvtColor' и создать пороговое значение с 'cv2.threshold'. – PSchn

+0

Спасибо. Я могу бинаризовать изображение. Не могли бы вы помочь мне, как мне подсчитать пересечение с помощью строки? Я использую opencv с python –