cv2.rectangle()在图像上绘制不正确的矩形。

huangapple go评论81阅读模式
英文:

cv2.rectangle() draws improper rectangle on image

问题

以下是您要翻译的代码部分:

# 点击事件的创建:
window.fig.canvas.mpl_connect('button_press_event', onclick)

# 点击事件处理函数:
frameSize = 64
ix, iy = 0, 0
def onclick(event):
    global ix, iy

    # 获取用户点击的坐标
    ix, iy = event.xdata, event.ydata
    print(f'中心坐标:x = {ix}, y = {iy},边长 = {frameSize}')

    # 打印坐标
    print("----------------------")
    left_TOP_x = int(ix - frameSize/2)
    left_TOP_y = int(iy - frameSize/2)
    right_BOTTOM_x = int(ix + frameSize/2)
    right_BOTTOM_y = int(iy + frameSize/2)
    print(f'取整后左上角坐标:left_TOP_x = {left_TOP_x}, left_TOP_y = {left_TOP_y}')
    print(f'取整后右下角坐标:right_BOTTOM_x = {right_BOTTOM_x}, right_BOTTOM_y = {right_BOTTOM_y}')
    print("----------------------")

    # 绘制正方形
    cv2.rectangle(img, (left_TOP_x, left_TOP_y, right_BOTTOM_x, right_BOTTOM_y), color=(255, 0, 0), thickness=2)
    window.ax.imshow(img)
    window.canvas.draw()

希望这有助于您理解代码的逻辑。如果您需要进一步的帮助,请随时提问。

英文:

The idea is simple: user clicks on the image at some point P(x,y) then the app takes this coordinate which determine center of a square. The square then should appear around P(x,y). But instead of it I get rectangle with improper shape.
My code below.

Create event of clicking:
window.fig.canvas.mpl_connect('button_press_event', onclick)
(https://matplotlib.org/stable/users/explain/event_handling.html)

Then:

frameSize = 64
ix, iy = 0, 0
def onclick(event):
    global ix, iy

# take the coordinates of user`s click
    ix, iy = event.xdata, event.ydata
    print (f'Center:\tx = {ix}, y = {iy} frameSize = {frameSize}')
   

#print coordinates
    print ("----------------------")
    left_TOP_x = int(ix - frameSize/2)
    left_TOP_y = int(iy - frameSize/2)
    right_BOTTOM_x = int(ix + frameSize/2)
    right_BOTTOM_y = int(iy + frameSize/2)
    print (f'to int\t left_TOP_x = {left_TOP_x}, left_TOP_y = {left_TOP_y}')
    print (f'to int\t right_BOTTOM_x = {right_BOTTOM_x}, right_BOTTOM_y = {right_BOTTOM_y}')
    print ("----------------------\n")

#draw the square
    cv2.rectangle(img, (left_TOP_x,left_TOP_y,right_BOTTOM_x, right_BOTTOM_y ), color=(255, 0, 0), thickness= 2)
    window.ax.imshow(img)
    window.canvas.draw()

I make first click and recieve this:

(image size is 254x199)
improper rectangle

But the coordinates always are fine!

Center: x = 131.67556141774892, y = 111.16829004329006 frameSize = 64
----------------------
to int   left_TOP_x = 99, left_TOP_y = 79
to int   right_BOTTOM_x = 163, right_BOTTOM_y = 143
----------------------

I made GUI via QtDesigner (maybe it is important)

self.plotWidget = QtWidgets.QWidget(self.verticalLayoutWidget)
        self.verticalLayout.addWidget(self.plotWidget)
       
        self.plotWidget.setStyleSheet("")
        self.plotWidget.setObjectName("plotWidget")
        self.plotLayout = QtWidgets.QVBoxLayout(self.plotWidget)
        self.plotLayout.setContentsMargins(0, 0, 0, 0)  
        self.plotLayout.setObjectName("plotLayout")

I've tryed to crop the image with this coords. I get image that I need

 crop_img = img[left_TOP_y:right_BOTTOM_y, left_TOP_x:right_BOTTOM_x]
    crop_img = cv2.cvtColor(crop_img, cv2.COLOR_BGR2RGB)
   
    cv2.imshow("imagggge", crop_img)
    test_image(crop_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

But I have not solved the problem of drawing square yet.

答案1

得分: 1

cv2.rectangle有两种形式:

第一种形式以参数描述矩形的左上角和右下角,如下:

cv2.rectangle(img, pt1, pt2, color, ...)

第二种形式以参数描述矩形的(C++类型) cv::Rect,如下:

cv2.rectangle(img, rec, color, ...)

Rect的表示形式为(x, y, width, height),其中(x, y) 对应于第一种形式中的 pt1

因此,您的正方形绘制线应该是以下两种之一:

cv2.rectangle(img, (left_TOP_x, left_TOP_y, frameSize, frameSize), color=(255, 0, 0), thickness=2)

cv2.rectangle(img, (left_TOP_x, left_TOP_y), (right_BOTTOM_x, right_BOTTOM_y), color=(255, 0, 0), thickness=2)
英文:

cv2.rectangle has two forms:

cv.rectangle(img, pt1, pt2, color, ...)
cv.rectangle(img, rec, color, ...)

The first form takes the top left and the bottom right corners as parameters describing the rectangle. The second form takes a (C++ type) cv::Rect as parameter describing the rectangle. The Rect is derived as (x, y, width, height), with (x, y) corresponding to pt1 in the first form.

So your square drawing line should be either

cv2.rectangle(img, (left_TOP_x, left_TOP_y, frameSize, frameSize), color=(255, 0, 0), thickness= 2)

or

cv2.rectangle(img, (left_TOP_x, left_TOP_y), (right_BOTTOM_x, right_BOTTOM_y), color=(255, 0, 0), thickness= 2)

huangapple
  • 本文由 发表于 2023年7月31日 22:15:23
  • 转载请务必保留本文链接:https://go.coder-hub.com/76804480.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定