gpt4 book ai didi

c - OpenCV 根据像素值调整大小和裁剪图像

转载 作者:太空宇宙 更新时间:2023-11-04 05:05:55 25 4
gpt4 key购买 nike

#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 的初学者。

最佳答案

在急于寻找什么-the-heck-is-the-problem 的过程中,人们往往会忘记一个更重要的问题:< strong>如何-the-heck-do-i-find-the-problem

对于图像处理应用程序,poor man's debugger 可以回答如何在 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);

这就解决了问题。

关于c - OpenCV 根据像素值调整大小和裁剪图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8006706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com