Rella
Rella

Reputation: 66945

OpenCV - How to enable scrolling to windows with images?

So currently I open images created with openCV with something like

                cvNamedWindow( "Original Image", CV_WINDOW_AUTOSIZE );
                cvShowImage( "Original Image", original );

but my images are quite large and go off the screen like shown here

Lena

I want windows to be resizable or at least the size of the users screen but with scrolling.

How to do such thing?

Upvotes: 3

Views: 23543

Answers (5)

iv67
iv67

Reputation: 4151

The best thing that I can do with pure opencv is by modifying the opencv trackbar method. I'm using ROI to update the display image according to the slider value. The weakness of this method is, opencv trackbar is displayed horizontally not vertically like the normal scrollbar, so in this case it is up to you whether you want to rotate your image horizontally or not.

int slider_max, slider, displayHeight;
int displayWidth = 1900;
Mat src1;  // original big image
Mat dst;
cv::Rect roi;

static void on_trackbar(int, void*)
{
    roi = cv::Rect(slider, 0, displayWidth, displayHeight);  //Update ROI for display
    dst = src1(roi);

    imshow("Result", dst);
}
int main(void)
{
    src1 = imread("BigImg.jpg");  // your big image
    cv::rotate(src1, src1, cv::ROTATE_90_CLOCKWISE); //I rotate my image because opencv trackbar is displayed horizontally 
    cv::resize(src1, src1, cv::Size(src1.cols/2, src1.rows/2));  // resize the image if it's too big to display in 1 window
    if (src1.empty()) { cout << "Error loading src1 \n"; return -1; }

    slider_max = src1.cols - displayWidth;
    slider = 0;
    displayHeight = src1.rows;

    namedWindow("Result", WINDOW_AUTOSIZE); // Create Window
    char TrackbarName[50];
    sprintf(TrackbarName, "Pixel Pos");
    createTrackbar(TrackbarName, "Result", &slider, slider_max, on_trackbar);
    on_trackbar(slider, 0);
    waitKey(0);
    return 0;
}

For changing the trackbar's orientation then you will need to use Qt or other GUI How to change the position of the trackbar in OpenCV applications?

Upvotes: 0

mpenkov
mpenkov

Reputation: 21898

EDIT

Short answer: you can't "enable" it, you have to implement it.

OpenCV does have trackbars -- have a look at the documentation, in particular the cvCreateTrackbar function. However, even if you use them, you still have to write the code behind it (for determining the new ROI and determining what to actually show).

If this sounds a bit too daunting, then you can wrap the displayed image using some GUI framework. Here is an example that uses OpenCV with wxWidgets. Of course, you can use any other GUI framework (for example, Qt).

Upvotes: 4

tsmgeo
tsmgeo

Reputation: 41

A simple way to scroll large image is by usage of trackbar and a Rectangular for snipping.

  .
  .
  .

namedWindow("winImage",WINDOW_AUTOSIZE);
namedWindow("controlWin",WINDOW_AUTOSIZE);

int winH=300;
int winW=600;
if(winH>=largeImage.rows)winH=largeImage.rows-1;
if(winW>=largeImage.cols)winW=largeImage.cols-1;

int scrolHight=0;
int scrolWidth=0;  
cvCreateTrackbar("Hscroll", "controlWin", &scrolHight, (largeImage.rows -winH));
cvCreateTrackbar("Wscroll", "controlWin", &scrolWidth, (largeImage.cols -winW));
while(waitKey(0)!='q'){
 Mat winImage= largeImage( Rect(scrolWidth,scrolHight,winW,winH) );
 imshow("winImage",winImage);
}//while
  .
  .

Upvotes: 4

Guestyguest
Guestyguest

Reputation: 31

This might help for one step: Just use CV_WINDOW_NORMAL instead of CV_WINDOW_AUTOSIZE.

cvNamedWindow(yourWindowName, CV_WINDOW_NORMAL);

cvShowImage("Original Image", original);

Upvotes: 3

Cheers and hth. - Alf
Cheers and hth. - Alf

Reputation: 145279

As far as I know (but I've only recently started looking at OpenCV) you need to build the OpenCV library with the Qt GUI library as GUI backend.

Then you get all the cute functions.

Well, OK, there's not very much, but the little that is there is documented as Qt only.

EDIT: PS, since possibly other answer might sow confusion, I'm not talking about using Qt to implement such functionality yourself. I'm talking about the functionality available in OpenCV's HighGUI module.

Cheers & hth.,

Upvotes: 0

Related Questions