Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

selectROI returns a rectangle, not a cropped image, as you expected.

>>> help(cv2.selectROI)
Help on built-in function selectROI:

selectROI(...)
    selectROI(windowName, img[, showCrosshair[, fromCenter]]) -> retval
    .   @brief Selects ROI on the given image.
    .   Function creates a window and allows user to select a ROI using mouse.
    .   Controls: use `space` or `enter` to finish selection, use key `c` to cancel selection (function will return the zero cv::Rect).
    .
    .   @param windowName name of the window where selection process will be shown.
    .   @param img image to select a ROI.
    .   @param showCrosshair if true crosshair of selection rectangle will be shown.
    .   @param fromCenter if true center of selection will match initial mouse position. In opposite case a corner of
    .   selection rectangle will correspont to the initial mouse position.
    .   @return selected ROI or empty rect if selection canceled.
    .
    .   @note The function sets it's own mouse callback for specified window using cv::setMouseCallback(windowName, ...).
    .   After finish of work an empty callback will be set for the used window.



    selectROI(img[, showCrosshair[, fromCenter]]) -> retval
    .   @overload

what you probably wanted is (wild guess):

(x,y,w,h) = cv2.selectROI(winname, img)
cropped = img[y,y+h : x,x+w]

selectROI returns a rectangle, not a cropped image, as you expected.image. (expectation mismatch)

>>> help(cv2.selectROI)
Help on built-in function selectROI:

selectROI(...)
    selectROI(windowName, img[, showCrosshair[, fromCenter]]) -> retval
    .   @brief Selects ROI on the given image.
    .   Function creates a window and allows user to select a ROI using mouse.
    .   Controls: use `space` or `enter` to finish selection, use key `c` to cancel selection (function will return the zero cv::Rect).
    .
    .   @param windowName name of the window where selection process will be shown.
    .   @param img image to select a ROI.
    .   @param showCrosshair if true crosshair of selection rectangle will be shown.
    .   @param fromCenter if true center of selection will match initial mouse position. In opposite case a corner of
    .   selection rectangle will correspont to the initial mouse position.
    .   @return selected ROI or empty rect if selection canceled.
    .
    .   @note The function sets it's own mouse callback for specified window using cv::setMouseCallback(windowName, ...).
    .   After finish of work an empty callback will be set for the used window.



    selectROI(img[, showCrosshair[, fromCenter]]) -> retval
    .   @overload

what you probably wanted is (wild guess):

(x,y,w,h) = cv2.selectROI(winname, img)
cropped = img[y,y+h : x,x+w]

selectROI returns a rectangle, not a cropped image. (expectation mismatch)

>>> help(cv2.selectROI)
Help on built-in function selectROI:

selectROI(...)
    selectROI(windowName, img[, showCrosshair[, fromCenter]]) -> retval
    .   @brief Selects ROI on the given image.
    .   Function creates a window and allows user to select a ROI using mouse.
    .   Controls: use `space` or `enter` to finish selection, use key `c` to cancel selection (function will return the zero cv::Rect).
    .
    .   @param windowName name of the window where selection process will be shown.
    .   @param img image to select a ROI.
    .   @param showCrosshair if true crosshair of selection rectangle will be shown.
    .   @param fromCenter if true center of selection will match initial mouse position. In opposite case a corner of
    .   selection rectangle will correspont to the initial mouse position.
    .   @return selected ROI or empty rect if selection canceled.
    .
    .   @note The function sets it's own mouse callback for specified window using cv::setMouseCallback(windowName, ...).
    .   After finish of work an empty callback will be set for the used window.



    selectROI(img[, showCrosshair[, fromCenter]]) -> retval
    .   @overload

what you probably wanted is (wild guess):

(x,y,w,h) = cv2.selectROI(winname, img)
cropped = img[y,y+h : x,x+w]
x,x+w] # both opencv ad numpy are "row-major", so y goes first

selectROI returns a rectangle, not a cropped image. (expectation mismatch)

>>> help(cv2.selectROI)
Help on built-in function selectROI:

selectROI(...)
    selectROI(windowName, img[, showCrosshair[, fromCenter]]) -> retval
    .   @brief Selects ROI on the given image.
    .   Function creates a window and allows user to select a ROI using mouse.
    .   Controls: use `space` or `enter` to finish selection, use key `c` to cancel selection (function will return the zero cv::Rect).
    .
    .   @param windowName name of the window where selection process will be shown.
    .   @param img image to select a ROI.
    .   @param showCrosshair if true crosshair of selection rectangle will be shown.
    .   @param fromCenter if true center of selection will match initial mouse position. In opposite case a corner of
    .   selection rectangle will correspont to the initial mouse position.
    .   @return selected ROI or empty rect if selection canceled.
    .
    .   @note The function sets it's own mouse callback for specified window using cv::setMouseCallback(windowName, ...).
    .   After finish of work an empty callback will be set for the used window.



    selectROI(img[, showCrosshair[, fromCenter]]) -> retval
    .   @overload

what you probably wanted is (wild guess):

(x,y,w,h) = cv2.selectROI(winname, img)
cropped = img[y,y+h : x,x+w] # both opencv ad and numpy are "row-major", so y goes first

selectROI returns a rectangle, not a cropped image. (expectation mismatch)

>>> help(cv2.selectROI)
Help on built-in function selectROI:

selectROI(...)
    selectROI(windowName, img[, showCrosshair[, fromCenter]]) -> retval
    .   @brief Selects ROI on the given image.
    .   Function creates a window and allows user to select a ROI using mouse.
    .   Controls: use `space` or `enter` to finish selection, use key `c` to cancel selection (function will return the zero cv::Rect).
    .
    .   @param windowName name of the window where selection process will be shown.
    .   @param img image to select a ROI.
    .   @param showCrosshair if true crosshair of selection rectangle will be shown.
    .   @param fromCenter if true center of selection will match initial mouse position. In opposite case a corner of
    .   selection rectangle will correspont to the initial mouse position.
    .   @return selected ROI or empty rect if selection canceled.
    .
    .   @note The function sets it's own mouse callback for specified window using cv::setMouseCallback(windowName, ...).
    .   After finish of work an empty callback will be set for the used window.



    selectROI(img[, showCrosshair[, fromCenter]]) -> retval
    .   @overload

what you probably wanted is (wild guess):

(x,y,w,h) = cv2.selectROI(winname, img)
cropped = img[y,y+h : x,x+w] img[y:y+h , x:x+w] # both opencv and numpy are "row-major", so y goes first