解决方案网上有很多,尝试以后依然bug,这里先做一个记录,有时间再来处理。
错误报告如下:
OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script) in cvShowImage, file -------src-dir-------/opencv-2.4.10/modules/highgui/src/window.cpp, line 501
Traceback (most recent call last):
File "test.py", line 20, in <module>
cv2.imshow('img',img)
cv2.error: -------src-dir-------/opencv-2.4.10/modules/highgui/src/window.cpp:501: error: (-2) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function cvShowImage
这里我们切换另一种解决方案,利用python的matplotlib库完成图像的输出以及鼠标事件的添加。
点击图片,在图像中鼠标对应位置画点:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
from matplotlib import pyplot as plt
import cv2
def on_press(event):
if event.inaxes = = None :
print "none"
return
ax.scatter(event.xdata, event.ydata)
fig.canvas.draw()
if __name__ = = "__main__" :
fileN = r './0107_1.3.6.1.4.1.14519.5.2.1.6279.6001.263660956768649083933159084365.bmp'
img = cv2.imread(fileN)
cv2.imshow( 'img' ,img)
fig = py.figure()
fig.canvas.mpl_connect( "button_press_event" , on_press)
ax = fig.add_subplot( 121 )
ax1 = fig.add_subplot( 122 )
ax.imshow(img)
ax1.imshow(img)
plt.axis( "off" )
plt.show()
|
先来简单解释一下代码的含义:
?
1
2
3
4
5
|
fig.canvas.mpl_connect( "button_press_event" , on_press)
def on_press(event):
event.inaxes.figure.canvas.draw()
event.x
event.xdata,event.ydata
|
最后的输出结果入下图。我们得到了非常奇怪的结果,如果你自己亲自动手试的话体会应该会更有体会,两边的图像本来应该一样大,但在第一次绘制点的时候,左侧图像出现了闪动,然后尺寸的比例突然发生了变化。
是的,图像尺寸没有发生变化,但尺寸的比例的确变了,这里我们要做的就是关闭自动变化的尺度比例。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
if __name__ = = "__main__" :
fileN = r './0107_1.3.6.1.4.1.14519.5.2.1.6279.6001.263660956768649083933159084365.bmp'
img = cv2.imread(fileN)
cv2.imshow( 'img' ,img)
fig = py.figure()
fig.canvas.mpl_connect( "button_press_event" , on_press)
ax = fig.add_subplot( 121 )
ax1 = fig.add_subplot( 122 )
ax.imshow(img)
ax1.imshow(img)
ax.set_autoscale_on( False )
plt.axis( "off" )
plt.show()
|
当然,我们可以改变绘制标记的样式:
?
1
2
3
4
|
ax.scatter(x,y,c = 'k' ,s = 25 ,alpha = 1.0 ,marker = 'o' )
|
现在我们能够在图像上进行标记了,但这样还不够,程序需要获取这些标记点。
实际上fig.canvas.mpl_connect("button_press_event", on_press)能够进行自定义的多参数传递,如果在每次绘制的时候将数据保存在外部传入的列表中,那么当画板被销毁时,我们就能获取到原来所有的绘制点。
这里介绍两种使用方法:
?
1
2
3
|
def on_key(event, arg1, arg2, arg3):
pass
canvas.mpl_connect( 'key_press_event' , lambda event: on_key(event, plt1, plt2, plt3))
|
和
?
1
2
3
|
def on_key(event, args_list):
pass
fig.canvas.mpl_connect( 'key_press_event' , lambda event: on_key(event, [plt1, plt2, plt3]))
|
这里需要注意的是scatter绘制的点,实际上并没有大小的概念,这个点实质是一个坐标。
如果需要绘制有实际面积的圆形的标记,可以使用matplotlib.patches.Circle
具体的使用如下:
?
1
2
3
4
5
6
|
from matplotlib.patches import Circle
fig = plt.figure()
ax = fig.add_subplot( 111 )
cir = Circle(xy = (event.xdata, event.ydata),facecolor = 'black' , edgecolor = 'black' ,radius = 10 , alpha = 1.0 )
ax.add_patch(cir)
|
|