OpenCv 2.3 C – Как изолировать объект внутри изображения

У меня есть изображение вроде:

источник

Я хочу удалить черные ряды и cols вокруг числа. Поэтому я хочу, чтобы результат:

вывод

я пробую это:

void findX(IplImage* imgSrc,int* min, int* max){ int i; int minFound=0; CvMat data; CvScalar maxVal=cvRealScalar(imgSrc->width * 255); CvScalar val=cvRealScalar(0); //For each col sum, if sum < width*255 then we find the min //then continue to end to search the max, if sum< width*255 then is new max for (i=0; iwidth; i++){ cvGetCol(imgSrc, &data, i); val= cvSum(&data); if(val.val[0] width * 255); CvScalar val=cvRealScalar(0); //For each col sum, if sum < width*255 then we find the min //then continue to end to search the max, if sum< width*255 then is new max for (i=0; iheight; i++){ cvGetRow(imgSrc, &data, i); val= cvSum(&data); if(val.val[0] < maxVal.val[0]){ *max=i; if(!minFound){ *min= i; minFound= 1; } } } } CvRect findBB(IplImage* imgSrc){ CvRect aux; int xmin, xmax, ymin, ymax; xmin=xmax=ymin=ymax=0; findX(imgSrc, &xmin, &xmax); findY(imgSrc, &ymin, &ymax); aux=cvRect(xmin, ymin, xmax-xmin, ymax-ymin); //printf("BB: %d,%d - %d,%d\n", aux.x, aux.y, aux.width, aux.height); return aux; } 

Поэтому я использую:

 IplImage *my_image = cvLoad.... CvRect bb = findBB(my_image); IplImage *new_image = cvCreateImage(cvSize(bb.width,bb.height), my_image->depth, 1); cvShowImage("test",new_image); 

это не работает хорошо, потому что я пытаюсь проверить, есть ли в новом изображении черные строки или столбцы, и они присутствуют. Что я могу сделать? Кто-нибудь может мне помочь? (Извините за мой английский!)

One Solution collect form web for “OpenCv 2.3 C – Как изолировать объект внутри изображения”

Один из способов сделать это – просто выполнить метод ограничительной frameworks для определения цифры, как показано на рисунке ниже:

введите описание изображения здесь

Поскольку ваш образ уже обработан, техника ограничительной frameworks, которую я использую, намного проще.

После этой процедуры все, что вам действительно нужно сделать, это установить ROI (область интереса) исходного изображения в область, определенную полем, чтобы добиться эффекта обрезки и изолировать объект:

введите описание изображения здесь

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

Это в значительной степени дорожная карта для достижения желаемого. В образовательных целях я делюсь кодом, который я написал, используя интерфейс OpenCV на C ++. Я уверен, что вы можете преобразовать его в интерфейс C.

 #include  #include  #include  int main(int argc, char* argv[]) { cv::Mat img = cv::imread(argv[1]); // Convert RGB Mat to GRAY cv::Mat gray; cv::cvtColor(img, gray, CV_BGR2GRAY); // Store the set of points in the image before assembling the bounding box std::vector points; cv::Mat_::iterator it = gray.begin(); cv::Mat_::iterator end = gray.end(); for (; it != end; ++it) { if (*it) points.push_back(it.pos()); } // Compute minimal bounding box cv::RotatedRect box = cv::minAreaRect(cv::Mat(points)); // Draw bounding box in the original image (debug purposes) //cv::Point2f vertices[4]; //box.points(vertices); //for (int i = 0; i < 4; ++i) //{ //cv::line(img, vertices[i], vertices[(i + 1) % 4], cv::Scalar(0, 255, 0), 1, CV_AA); //} //cv::imshow("box", img); //cv::imwrite("box.png", img); // Set Region of Interest to the area defined by the box cv::Rect roi; roi.x = box.center.x - (box.size.width / 2); roi.y = box.center.y - (box.size.height / 2); roi.width = box.size.width; roi.height = box.size.height; // Crop the original image to the defined ROI cv::Mat crop = img(roi); cv::imshow("crop", crop); cv::imwrite("cropped.png", crop); cvWaitKey(0); return 0; } 
  • Изменение размера изображения пропорционально ограничениям MaxHeight и MaxWidth
  • обработка изображений для повышения точности Tesseract OCR
  • Быстрое размытие растровых изображений для Android SDK
  • Преобразование YUV-> RGB (Обработка изображений) -> YUV во время onPreviewFrame в android?
  • OpenCV C ++ / Obj-C: Обнаружение листа бумаги / Квадратное обнаружение
  • Заполните отверстия в OpenCV
  • Давайте будем гением компьютера.