2011-11-04 122 views
0
#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的初学者。OpenCV根据像素值调整大小和裁剪图像

+0

我会在每个步骤之间粘贴一堆'cvSaveImage()'调用来查看它实际上变得不正确的地方。 – dragonroot

+0

我做了一些编辑。可能是什么问题,为什么输出图像只是相同的二进制图像? – cmsl

+0

这个问题的答案是否成功?请查看答案并接受解决问题的答案。只需点击附近的复选框选择正式答案。通过这样做你会帮助未来的游客。 – karlphillip

回答

12

在寻找的高峰什么 -the - 赫克,是最问题人们往往忘记一个更重要的问题:如何 -the-赫克-DO-I-找到-the-问题

随着图像处理应用中,如何可以通过在OpenCV中的poor man's debugger这是通过代码加入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的值。

所以问题在于,在处理结束时,当您将生成的图像保存到dislk中时,忘了标准化的值回原来的范围

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

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

    cvSaveImage("result.jpg", cropImage); 

这解决了这个问题。