Изменение размера OpenCV и обрезка изображения в соответствии со значением пикселя - PullRequest
0 голосов
/ 04 ноября 2011
#include "iostream"
#include "cv.h"
#include "highgui.h"
#include "cvaux.h"
#include "cxmisc.h"
#include "math.h"

using namespace cv;
using namespace std;

int main(){

int height, width, x, y, i, minX, minY, maxX, maxY;
char imgFileName[100];


IplImage *origImage = cvLoadImage("BaybayinMark/b9.jpg", -1);
height = origImage->height;
width = origImage->width;

IplImage *grayImage = cvCreateImage(cvSize(width, height), 8, 1);
IplImage *binImage = cvCreateImage(cvSize(width, height), 8, 1);


//Pre-processing phase


cvCvtColor(origImage, grayImage, CV_BGR2GRAY);
cvDilate(grayImage, grayImage, NULL, 1);
cvSmooth(grayImage, grayImage, CV_GAUSSIAN, 21, 21, 0, 0);
cvThreshold(grayImage, binImage, 120, 255, CV_THRESH_BINARY);
cvNormalize(binImage,binImage,0,1,CV_MINMAX);

minX = width;
minY = height;
maxX = 0;
maxY = 0;


CvScalar s;


for (x=0; x<width-1; x++){
for(y=0; y<height-1; y++){
    s = cvGet2D(binImage, y, x);
    //printf("%f\n", s.val[0]);
    if (s.val[0] == 1){
        //printf("HELLO");
        minX = min(minX, x);
        minY = min(minY, y);
        maxX = max(maxX, x);
        maxY = max(maxY, y);

    }   
}
}

cvSetImageROI(binImage, cvRect(minX, minY, maxX-minX, maxY-minY));

IplImage *cropImage = cvCreateImage(cvGetSize(binImage), 8, 1);

cvCopy(binImage, cropImage, NULL);

cvSaveImage("crop/cropImage9.jpg", cropImage);
cvResetImageROI(binImage);

cvReleaseImage(&origImage);
cvReleaseImage(&binImage);

cvReleaseImage(&grayImage);
cvReleaseImage(&cropImage);

}

Привет! Я просто хочу спросить об этом коде. Я пытаюсь определить внешние края изображения и обрезать изображение в соответствии с ними. Все, что у меня было после бега, было черным изображением того же размера. Я пытаюсь сделать это неправильно? Пожалуйста, просветите меня, я новичок в OpenCV.

1 Ответ

12 голосов
/ 19 ноября 2011

В спешке находя что проблема, с которой сталкиваются люди склонны забывать более важный вопрос: как -The-черт-ду-я-найти-проблема .

В приложениях для обработки изображений на how может ответить отладчик бедняка в OpenCV, , который добавляет cvSaveImage() звонки через код к быть в состоянии визуализировать то, что делает каждый шаг пути:

    //Pre-processing phase
    cvCvtColor(origImage, grayImage, CV_BGR2GRAY);
    cvSaveImage("cv_color.jpg", grayImage);

    cvDilate(grayImage, grayImage, NULL, 1);
    cvSaveImage("cv_dilate.jpg", grayImage);

    cvSmooth(grayImage, grayImage, CV_GAUSSIAN, 21, 21, 0, 0);
    cvSaveImage("cv_smooth.jpg", grayImage);

    cvThreshold(grayImage, binImage, 120, 255, CV_THRESH_BINARY);
    cvSaveImage("cv_threshold.jpg", binImage);

    cvNormalize(binImage,binImage,0,1,CV_MINMAX);
    cvSaveImage("cv_normalize.jpg", binImage);

Этот код показывает, что получающееся изображение становится черным еще до того, как пользовательский цикл for, и вызов, который отвечает за это cvNormalize(). Но это имеет смысл правильно? Вы преобразуете пиксели в диапазоне [0..255] в значения 0 и 1.

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

    IplImage *cropImage = cvCreateImage(cvGetSize(binImage), 8, 1);
    cvCopy(binImage, cropImage, NULL);

    cvNormalize(cropImage, cropImage, 0, 255, CV_MINMAX);

    cvSaveImage("result.jpg", cropImage);

И это решает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...