2014-09-17 2 views
-1

Я пытаюсь извлечь из изображения только контуры, имеющие определенный размер.Утверждение Opencv не удалось

обрабатывает как этого

int offsetX ; 
int offsetY ; 
//here: read original image as 8UC3 
cv::Mat original = cv::imread("0.png"); 
Mat imgx=original.clone(); 
cv::imshow("original", original); 
cvtColor(imgx,imgx,CV_BGR2GRAY); 
Mat thresh; 
vector<Vec4i> hierarchy; 
RNG rng(12345); 
vector < vector<Point> > contours; 
adaptiveThreshold(imgx, thresh, 255, 1, 1, 31, 2); 
findContours(thresh, contours, CV_RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); 
Mat drawing = Mat::zeros(thresh.size(), CV_8UC3); 
cout << "drawing "<<drawing.type()<<endl; 
cv::Mat image = cv::Mat(original.rows, original.cols, original.type()); 
image.setTo(cv::Scalar::all(255)); 
for (size_t i = 0; i < contours.size(); i++) 
{ 
    vector <Point> cnt = contours[i]; 
    if (contourArea(cnt) > 0) 
    { 
     Rect rec = boundingRect(cnt); 
     if ((rec.height > 20) &&(3.5*rec.height>rec.width)&& (rec.width>15)/*&& (rec.width<40)*/) 
     { 
      cout<<rec.x<<" "<<rec.y<<endl; 
      offsetX=rec.x; 
      offsetY=rec.y; 
      Mat roi = original(rec); 
      int width = roi.cols; 
      int height = roi.rows; 
      cout <<"h= "<<height<<" w= "<<width<<endl; 
      cv::Rect characterLocation; 
      if(height>35) 
       characterLocation = cv::Rect(offsetX+3, offsetY, width, height); 
      else 
       characterLocation = cv::Rect(offsetX, offsetY, width, height); 
      original(characterLocation).copyTo(image(characterLocation)); 
      imshow("jihedddd",roi); 
      imwrite("xxxxxx.png",roi); 
      Mat stagedImage; 
      Mat img; 
      Scalar color = Scalar(255, 255, 255); 
      drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point()); 
      imshow("Contours", drawing); 
      waitKey(); 
      GaussianBlur(stagedImage, img, Size(5, 5), 2, 2); 
      medianBlur(img, stagedImage, 3); 
      Mat copy = original.clone(); 
      rectangle(copy, Point(rec.x, rec.y), 
      Point(rec.x + rec.width, rec.y + rec.height), 
      CV_RGB(0x00,0x00,0xff), 3); 
      cv::imshow("char copied", image); 
     } 
    } 
} 
medianBlur(image,image,3); 
cv::imshow("char copied", image); 
cv::imwrite("characterC_result.tiff ", image); 
cv::waitKey(); 

Но когда я запускаю этот код у меня есть ошибка

opencv error :assertion failed 

Это пример image которые дают мне сильфон ошибки. Любая помощь пожалуйста.

+0

Вы прошли через него, чтобы узнать, где это ошибка? – GPPK

+0

Я думаю, что здесь ошибка оригинала (characterLocation) .copyTo (изображение (characterLocation)); но я до сих пор не знаю причину этого. – user3770614

+0

Вам придется отлаживать код, чтобы выяснить, какая именно строка кода вызывает эту проблему. Мы не можем помочь без этой информации. – karlphillip

ответ

0

вы должны быть осторожны с этим:

characterLocation = cv::Rect(offsetX+3, offsetY, width, height); 

если ширина является ImageWidth, вы вышли за пределы здесь. вам нужно либо вычесть x из ширины, либо обрезать прямоугольник к границам изображения:

// get the Rect for the original image: 
cv::Rect borders(Point(0,0), image.size()); 

// crop to the legal size: 
characterLocation = cv::Rect(offsetX+3, offsetY, width, height) & borders; 
Смежные вопросы