Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Qt for Python
  4. Keep track of number of rectangles drawn over an image using Mouse Events
Forum Updated to NodeBB v4.3 + New Features

Keep track of number of rectangles drawn over an image using Mouse Events

Scheduled Pinned Locked Moved Unsolved Qt for Python
27 Posts 2 Posters 2.8k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Offline
    D Offline
    duddal_
    wrote on last edited by
    #18

    @mrjj
    Okay, let me frame it in another way.

    Also, the "move" thing is only used as an example and is by no way related to our problem. This was just used as an example. Let's just forget about the "move" thing for now.

    You said:

    • I'm not sure what you mean by storing them in memory but I assume something is done during saving and you want to do this without saving the image.

    And this is correct.

    In order to annotate (draw shapes) the user needs to follow the following steps:

    1. Load the directory containing images.
    2. Draw the first shape and hit "Ctrl + S" (save) and save an XML file (with base-name same as image) that contains the name of the image, the coordinates of the shape (rectangle).
    3. The user draws a few shapes over the same image and then has to hit the save button. After this, a dialog box pops up which asks the user to select the same (point 2) file and then asks for permission to overwrite this file. And the cycle repeats itself.

    In order to avoid selecting the file to save again, I can set the self.defaultSaveDir as targetDirPath as mentioned here.

    At first, I thought I have to save the shapes in the memory and then use the saved shapes in order to tackle the aforementioned tackle for a more concrete solution. But this is not the correct way I guess.

    But the workaround works.

    1 Reply Last reply
    0
    • D Offline
      D Offline
      duddal_
      wrote on last edited by
      #19

      @mrjj
      How are you doing?

      I am working on the same thing.

      With labelImg, we can move the shapes by using the left mouse click and dragging the shape. However, I want to save the file as soon as the shape is moved. There is a function saveFile(True) in labelImg.py which helps us do exactly that.

      After debugging the code, I found that there is a function called labelSelectionChanged(self) in lebalImg.py which is called every time the shape is selected and/or dragged. I inserted an if-statement with the condition being that if this function is called, save the file. However, I noticed that the file keeps saving in an infinity loop (i.e. did not stop, I had to stop the program by Ctrl+C).

      One more solution I tried was: check if the Qt.ClosedHandCursor is used and then use that as a condition to save the file. This too did not work.

      I would like some help with this. This seems very easy but I can't get my head around this.

      1 Reply Last reply
      0
      • mrjjM Offline
        mrjjM Offline
        mrjj
        Lifetime Qt Champion
        wrote on last edited by
        #20

        Hi
        Welcome back.

        Saving with every move might not work well as it might happen too fast so it's called many times.
        I think that was what you saw when appeared to be in an infinity loop.

        Do you really want to save to file each time user adjusts the shape just a little bit?

        1 Reply Last reply
        0
        • D Offline
          D Offline
          duddal_
          wrote on last edited by
          #21

          Thanks for the reply!
          So, the problem is as follows:

          When the image is opened in the GUI, the program checks whether there is an annotation file (which contains shapes information) with the same name and then opens it with the image, thus, we can see the shapes with the image in the GUI. Now as you know that I have a button that changes the brightness even though new shapes are drawn. (We discussed this previously and the issue was just the save directory).

          Now, when the shapes are loaded from the file and I move them and try to change the brightness by pushing a button, the program checks the annotation file in the directory and loads it. Therefore, the previous shapes are loaded again. I want it to keep the same shape (when the shape is moved). Therefore I thought, if I can save the shapes when they are moved, this might eliminate the problem. I mean, I don't know if there is another method with which this can be solved but that was just what I came up with.

          mrjjM 1 Reply Last reply
          0
          • D duddal_

            Thanks for the reply!
            So, the problem is as follows:

            When the image is opened in the GUI, the program checks whether there is an annotation file (which contains shapes information) with the same name and then opens it with the image, thus, we can see the shapes with the image in the GUI. Now as you know that I have a button that changes the brightness even though new shapes are drawn. (We discussed this previously and the issue was just the save directory).

            Now, when the shapes are loaded from the file and I move them and try to change the brightness by pushing a button, the program checks the annotation file in the directory and loads it. Therefore, the previous shapes are loaded again. I want it to keep the same shape (when the shape is moved). Therefore I thought, if I can save the shapes when they are moved, this might eliminate the problem. I mean, I don't know if there is another method with which this can be solved but that was just what I came up with.

            mrjjM Offline
            mrjjM Offline
            mrjj
            Lifetime Qt Champion
            wrote on last edited by
            #22

            @duddal_

            Hi
            Well could you not just change code so even if you change brightness,
            it won't reload the shapes?

            Like adding a parameter to the function, so when called from the button,
            it wont reload file but in all other case it will.

            1 Reply Last reply
            0
            • D Offline
              D Offline
              duddal_
              wrote on last edited by
              #23

              Hi,
              What do you mean exactly? Adding an argument to which function?

              mrjjM 1 Reply Last reply
              0
              • D duddal_

                Hi,
                What do you mean exactly? Adding an argument to which function?

                mrjjM Offline
                mrjjM Offline
                mrjj
                Lifetime Qt Champion
                wrote on last edited by
                #24

                @duddal_

                Hi
                I mean, it sounds odd why it would reload the files just because you adjust brightness so
                i was wondering if you cant just change the code to make it not reload.

                I don't know which functions, it was more a generic thought. :)

                If you have a python debugger handy,
                then it should not be that complex to find out why brightness change will reload the shapes
                and make that not happen when its just brightness being adjusted.

                1 Reply Last reply
                0
                • D Offline
                  D Offline
                  duddal_
                  wrote on last edited by
                  #25

                  Okay Okay. I will make some changes to the code and probably paste it here so we can talk about it. Before that I have just one question, how can I check using an IF condition whether the shape was moved? (Perhaps comparing the coordinates from the previous point ?)

                  mrjjM 1 Reply Last reply
                  0
                  • D duddal_

                    Okay Okay. I will make some changes to the code and probably paste it here so we can talk about it. Before that I have just one question, how can I check using an IF condition whether the shape was moved? (Perhaps comparing the coordinates from the previous point ?)

                    mrjjM Offline
                    mrjjM Offline
                    mrjj
                    Lifetime Qt Champion
                    wrote on last edited by
                    #26

                    @duddal_

                    Hi.
                    Ok. still not sure how you adjust brightness but maybe dont matter.

                    Well, the normal way to track if something moved
                    would be to take the difference between now and the last position.
                    So yes, that should work fine.

                    1 Reply Last reply
                    0
                    • D Offline
                      D Offline
                      duddal_
                      wrote on last edited by duddal_
                      #27

                      So my shape from the txt file (annotation file) is :

                      shapes from the file: [('Object_A', [(14, 134), (816, 134), (816, 458), (14, 458)], None, None, False)]
                      

                      Then in the file canvas.py a function is written for moveMouseEvent() which includes the panning of the shape, moving of the shape and is as follows:

                      if Qt.LeftButton & ev.buttons():
                                  if self.selectedVertex():
                                      self.boundedMoveVertex(pos)
                                      self.shapeMoved.emit()
                                      self.repaint()
                                  elif self.selectedShape and self.prevPoint:
                                      self.overrideCursor(CURSOR_MOVE)
                                      self.boundedMoveShape(self.selectedShape, pos)
                                      self.shapeMoved.emit()
                                      self.repaint()
                                      print(f'selected shape prev point: {self.selectedShape.points}')
                      

                      I added the print statement just to output the coordinates of the shape when moved and the output is as follows:

                      selected shape prev point: [PyQt5.QtCore.QPointF(14.0, 133.0), PyQt5.QtCore.QPointF(816.0, 133.0), PyQt5.QtCore.QPointF(816.0, 457.0), PyQt5.QtCore.QPointF(14.0, 457.0)]
                      selected shape prev point: [PyQt5.QtCore.QPointF(17.0, 131.0), PyQt5.QtCore.QPointF(819.0, 131.0), PyQt5.QtCore.QPointF(819.0, 455.0), PyQt5.QtCore.QPointF(17.0, 455.0)]
                      selected shape prev point: [PyQt5.QtCore.QPointF(23.0, 131.0), PyQt5.QtCore.QPointF(825.0, 131.0), PyQt5.QtCore.QPointF(825.0, 455.0), PyQt5.QtCore.QPointF(23.0, 455.0)]
                      selected shape prev point: [PyQt5.QtCore.QPointF(33.0, 131.0), PyQt5.QtCore.QPointF(835.0, 131.0), PyQt5.QtCore.QPointF(835.0, 455.0), PyQt5.QtCore.QPointF(33.0, 455.0)]
                      

                      I am trying to save all these points in a concatenated list and then just use the last list of QPointF to compare with the shapes from the file. To compare I want to convert QPointF points as shown above in a list like [[(1, 2), (3, 4), (5, 6), (7, 8)], [(9, 10), (11, 12), (13, 14), (15, 16)]] . I can do this part but how do I convert the QPointF to list of lists and where can I access these points in the file labelImg.py?

                      1 Reply Last reply
                      0

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved