python-opencv 影象分塊處理
可能是由於剛接觸python,其函式引數傳遞跟C++有非常大的不同,花了很多的時間
還是按照慣例,先貼原始碼,但是在此之前先說明,多執行緒共享物件目前發現只能通過dict進行,發現list等其他型別並不起到引用傳遞的作用。
# -*- coding: cp936 -*-
import cv2
import sys
import multiprocessing
import time
import os
import numpy as np
class imgA:
def __init__(self):
print 'init:',os.getpid()
self.a=[]
self.b=[]
self.c=[]
self.all=[]
self.radius = multiprocessing.Manager().dict()
self.radius['a'] = self.a
self.radius['b']=self.b
self.radius['c']=self.c
self.radius['all']=self.all
def add(self):
for i in range(self.a.shape[0]):
for j in range(self.a.shape[1]):
if(self.a[i][j])>0:
self.a[i][j]=0
else:
self.a[i][j]=255
self.radius['a']=self.a
def add2(self):
for i in range(self.b.shape[0]):
for j in range(self.b.shape[1]):
if(self.b[i][j])>0:
self.b[i][j]=0
else:
self.b[i][j]=255
self.radius['b']=self.b #需要更新
def add3(self):
for i in range(self.all.shape[0]):
for j in range(self.all.shape[1]):
if(self.all[i][j])>0:
self.all[i][j]=0
else:
self.all[i][j]=255
self.radius['all']=self.all #需要更新
def read(self):
self.all=cv2.imread('E:\\41.bmp',0)
imgsize=self.all.shape[0]
self.a = (self.all)[0:imgsize/2]
self.b = (self.all)[imgsize/2:imgsize]
self.radius['a'] = self.a
self.radius['b']=self.b
self.radius['all']=self.all
if __name__ == '__main__':
t_ctime=time.clock()
aa = imgA()
aa.read()
print 'start'
process1 = multiprocessing.Process(target=aa.add, args=())
process2 = multiprocessing.Process(target=aa.add2, args=())
process1.daemon = True
process2.daemon = True
process1.start()
process2.start()
process1.join()
process2.join()
print 'done'
gg=np.concatenate((aa.radius['a'],aa.radius['b']))
t_ctime=(time.clock()-t_ctime)*1000
print t_ctime,'ms'
cv2.imshow('gg',gg)
cv2.imshow('a',aa.radius['a'])
cv2.imshow('b',aa.radius['b'])
cv2.imshow('all',aa.radius['all'])
# print aa.radius,os.getpid()
cv2.waitKey(0)
可以看到,每次操作我們並不直接操作共享物件,而是操作類中的,相當於其備份,等操作完成後再進行覆蓋,目前測試只發現這種方式可行。不使用類的形式,採用函式是絕對行不通的。
以上的程式碼總體思想是,將讀取的影象進行分塊,然後建立相應的程序(核心數決定),最後再組合在一起。經測試,多開一個程序效率提高大約在30%以上。如果有錯誤請聯絡QQ:498235584!萬分感謝