2015-08-04 4 views
1

Я довольно много искал везде и не может найти ответ на мою проблему. Я попытался реплицировать программное обеспечение для обнаружения текста из этой темы (Extracting text OpenCV), но в конце кода есть сообщение об ошибке, говорящее, что для прямоугольника нет соответствия, хотя я нарисовал один чуть выше, и мы входим в цикл. Я тестировал все значения, о которых я мог думать, и все кажется правильным.сообщение об ошибке: нет совпадений для вызова в '(cv :: Rect) (cv :: Mat &, cv :: Point_ <int>, cv :: Point, cv :: Scalar, int)'

вот полный код;

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 


using namespace cv; 
using namespace std; 





int main(int argc, char** argv) 
{ 

namedWindow("source_window2",WINDOW_AUTOSIZE); 
namedWindow("source_window3",WINDOW_AUTOSIZE); 
Mat input = imread(argv[1], CV_LOAD_IMAGE_COLOR); 
Mat in_gray = imread(argv[1],CV_LOAD_IMAGE_GRAYSCALE); 
Mat gradient; 

Mat Kernelellipse = getStructuringElement(MORPH_ELLIPSE, Size(3,3)); 
morphologyEx(in_gray, gradient, MORPH_GRADIENT, Kernelellipse); 
Mat thresh; 
//on convertit en binaire 
threshold(gradient, thresh, 0.0, 255.0, THRESH_BINARY | THRESH_OTSU); 
rectangle(input,Point(0,0),Point(50,50),Scalar(255,255,255),2); 
Mat Kernelrectangle = getStructuringElement(MORPH_RECT, Size(9,1)); 
Mat fermee; 
morphologyEx(thresh, fermee, MORPH_CLOSE, Kernelrectangle); 
imshow("source_window3", fermee); 

Mat noire = Mat::zeros(thresh.size(), CV_8UC1); 
//on cheche les contours 
vector<vector<Point> > contours; 
vector<Vec4i> hierarchy; 
findContours(fermee, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 
for (int i = 0; i < contours.size(); ++i) 
{ 
    Rect rectangle = boundingRect(contours[i]); 
    Mat noirerectangle(noire, rectangle); 
    noirerectangle = Scalar(0, 0, 0); 
    //on les dessine 
    drawContours(noire, contours, i, Scalar(255, 255, 255), CV_FILLED); 
    double proportion_de_blanc = (double)countNonZero(noirerectangle)/(rectangle.width*rectangle.height); 

    if (proportion_de_blanc > 0.45 && (rectangle.height > 8 && rectangle.width > 8)) 
    { 
     rectangle(input,rectangle.tl(),rectangle.br(),Scalar(0,255,0),2); 
    } 


} 
imshow("source_window2",input); 





waitKey(0); 
return(0); 

}

Мой вопрос в течение последнего цикла:

if (proportion_de_blanc > 0.45 && (rectangle.height > 8 && rectangle.width > 8)) 
    { 
     rectangle(input,rectangle.tl(),rectangle.br(),Scalar(0,255,0),2); 
    } 
+0

** C не C++ не является C! ** Не добавляйте теги в соответствие символов! – Olaf

ответ

2

Вы определили одну из ваших прямоугольников как:

Rect rectangle = boundingRect(contours[i]); 

Наименования прямоугольника сталкивается с rectangle рисунок функция. Так как:

  1. переименовывать прямоугольник с другим именем, например, Rectangle rect = boundingRect(contours[i]);

  2. вызова метода прямоугольник рисования, как cv::rectangle(input,rectangle.tl(),rectangle.br(),Scalar(0,255,0),2);

+0

Большое спасибо за вашу помощь, это был мой слабый выбор имени переменной. –

1

У вас есть

Rect rectangle = boundingRect(contours[i]); 

который создание переменная типа Rect с именем rectangle. Затем в течение цикла вы называете то, что я предполагаю, что это rectangle() функция

rectangle(input,rectangle.tl(),rectangle.br(),Scalar(0,255,0),2); 

В рамках которой сделан этот вызов компилятор обрабатывает rectangle как переменную, а не функции. Чтобы исправить это, вам нужно либо квалифицировать rectangle с cv::, либо вы можете изменить название своей переменной.

+0

Благодарим за помощь! Я действительно ценю это и не буду повторять эту ошибку! –

Смежные вопросы