OpenCV 图像裁剪

11

我在使用openCv裁剪IplImage时遇到了问题。假设tmp和img都是IplImage*,使用以下代码:

printf("Orig dimensions: %dx%d\n", img->width, img->height);
cvSetImageROI(img, cvRect(0, 0,500,500));
tmp = cvCreateImage(cvGetSize(img),img->depth,img->nChannels);
cvCopy(img, tmp, NULL);
cvResetImageROI(img);
img = cvCloneImage(tmp);
printf("Orig dimensions after crop: %dx%d\n", tmp->width, tmp->height);

当我使用上面的cvRect时,我将得到一个按预期裁剪为500 x 500大小的图像;然而,当我使用矩形(400,400,500,500)时,我将得到一个大小为500 x 320的图像。

4个回答

34

cvRect 被定义为 (int x, int y, int width, int height),而不是 (int left, int top, int right, int bottom)。因此,您选择了一个从点 (x,y) = (400,400) 开始的 500x500 区域。我猜测您的图像高度为 720 ;)


4
一个值得接受的答案;在我的谷歌搜索中排名第一。有时候,SO比官方文档快得多。 - Ryan Kennedy

7

使用OpenCV进行图像裁剪

Mat image=imread("image.png",1);

int startX=200,startY=200,width=100,height=100

Mat ROI(image, Rect(startX,startY,width,height));

Mat croppedImage;

// Copy the data into new matrix
ROI.copyTo(croppedImage);

imwrite("newImage.png",croppedImage);

1
尝试一下这个。它能工作。
                     IplImage *source_image;
                     IplImage *cropped_Image1;

                     cout << "Width:" << source_image->width << " pixels" << endl;
                     cout << "Height:" << source_image->height << " pixels" << endl;
                     int width = source_image->width;
                     int lenght = source_image->height;

                     cv::Rect roi;
                     roi.x = 1200; //1200     // 950
                     roi.y = 355; //350      //150 
                     roi.width = 2340; //2360          //2750
                     roi.height = 1425;  //1235 /2500         //2810   //2465 fully braille sheet


                     cropped_Image1 = cvCreateImage(cvSize(roi.width, roi.height), source_image->depth, source_image->nChannels);
                     cvSetImageROI(source_image, roi);
                     cvCopy(source_image, cropped_Image1);
                     cvResetImageROI(source_image);
                     cvShowImage("Cropped Image", cropped_Image1);
                     cvSaveImage("1_cropped.jpg", cropped_Image1);

0

你可以轻松地使用Python裁剪图像

roi = oriImage[refPoint[0][1]:refPoint[1][1], refPoint[0][0]:refPoint[1][0]]

为了获取这两个点,您可以调用cv2.setMouseCallback("image", mouse_crop)函数。该函数大致如下:

def mouse_crop(event, x, y, flags, param):
    # grab references to the global variables
    global x_start, y_start, x_end, y_end, cropping

    # if the left mouse button was DOWN, start RECORDING
    # (x, y) coordinates and indicate that cropping is being
    if event == cv2.EVENT_LBUTTONDOWN:
        x_start, y_start, x_end, y_end = x, y, x, y
        cropping = True

    # Mouse is Moving
    elif event == cv2.EVENT_MOUSEMOVE:
        if cropping == True:
            x_end, y_end = x, y

    # if the left mouse button was released
    elif event == cv2.EVENT_LBUTTONUP:
        # record the ending (x, y) coordinates
        x_end, y_end = x, y
        cropping = False # cropping is finished

        refPoint = [(x_start, y_start), (x_end, y_end)]

        if len(refPoint) == 2: #when two points were found
            roi = oriImage[refPoint[0][1]:refPoint[1][1], refPoint[0][0]:refPoint[1][0]]
            cv2.imshow("Cropped", roi)
            cv2.imwrite("crop.jpg",roi)

您可以从这里获取详细信息:使用Python进行鼠标点击和裁剪

对于C++,您可以按照以下方式操作:

void mouse_call(int event,int x,int y,int,void*)
{
    if(event==EVENT_LBUTTONDOWN)
    {
        leftDown=true;
        cor1.x=x;
        cor1.y=y;
        cout <<"Corner 1: "<<cor1<<endl;

    }
    if(event==EVENT_LBUTTONUP)
    {
        if(abs(x-cor1.x)>20&&abs(y-cor1.y)>20) //checking whether the region is too small
        {
            leftup=true;
            cor2.x=x;
            cor2.y=y;
            cout<<"Corner 2: "<<cor2<<endl;
        }
        else
        {
            cout<<"Select a region more than 20 pixels"<<endl;
        }
    }

    if(leftDown==true&&leftup==false) //when the left button is down
    {
        Point pt;
        pt.x=x;
        pt.y=y;
        Mat temp_img=img.clone();
        rectangle(temp_img,cor1,pt,Scalar(0,0,255)); //drawing a rectangle continuously
        imshow("Original",temp_img);

    }
    if(leftDown==true&&leftup==true) //when the selection is done
    {

        box.width=abs(cor1.x-cor2.x);
        box.height=abs(cor1.y-cor2.y);
        box.x=min(cor1.x,cor2.x);
        box.y=min(cor1.y,cor2.y);
        Mat crop(img,box); //Selecting a ROI(region of interest) from the original pic
        namedWindow("Cropped Image");
        imshow("Cropped Image",crop); //showing the cropped image
        leftDown=false;
        leftup=false;

    }

}

你可以从这里获取详细信息:使用C++进行鼠标点击和裁剪

问题是关于C++的。 - Denys Vitali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接