web-dev-qa-db-fra.com

image de recadrage openCv

Je rencontre des problèmes avec mon recadrage openCv IplImage. En supposant que tmp et img sont IplImage *. En utilisant le code:

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);

lorsque j'utilise le cvRect ci-dessus, je vais obtenir une image recadrée d'une taille de 500 x 500 comme prévu, mais lorsque j'utilise le rect (400 400 500 000), j'obtiens une image de la taille de 500 X 320.

11
Johann

cvRect est défini comme ( int x, int y, int width, int height ), pas (int left, int top, int right, int bottom). Donc, vous sélectionnez une région 500x500 à partir du point (x,y) = (400,400). Je suppose que votre image a une hauteur de 720;).

32
Smash

Recadrage d'images à l'aide d'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);
3
N.Singh

Essayez ceci. C'est du travail.

                     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
Vimukthi Gunasekara

vous pouvez facilement recadrer l'image en python en utilisant

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

Pour obtenir les deux points, vous pouvez appeler cv2.setMouseCallback("image", mouse_crop). La fonction est quelque chose comme ça

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)

Vous pouvez obtenir des détails à partir d’ici: Clic de souris et recadrage avec Python

0
Md. Hanif Ali Sohag