虽然这是一个相当充分记录的问题,但我找不到解决方案.
我无法导入PIL和ImageTK.
最小的例子:
import Tkinter as tk
from PIL import Image, ImageTk
root = tk.Tk()
image = Image.open('live.ppm')
photo = ImageTk.PhotoImage(image)
Run Code Online (Sandbox Code Playgroud)
这会产生错误:
File "C:\Anaconda\lib\site-packages\PIL\ImageTk.py", line 181, in paste
import _imagingtk
ImportError: No module named _imagingtk
Run Code Online (Sandbox Code Playgroud)
我试过了:
conda install pillow
conda remove PIL
Run Code Online (Sandbox Code Playgroud)
但没有运气.
我有一个队列类,其数据存储在向量中:
std::vector<boost::shared_ptr<rxImage> > queue;
Run Code Online (Sandbox Code Playgroud)
有一个线程添加到基于此循环的队列:
while(runRxThread){
this->rxImage();
}
Run Code Online (Sandbox Code Playgroud)
其中rxImage()的定义如下:
zmq::message_t img;
imageSocket->recv(&img);
//addToQueue is a push back:
//queue.push_back( boost::shared_ptr<rxImage> (new rxImage(data, imgSize)) );
localQueue->addToQueue((unsigned char*) img.data());
Run Code Online (Sandbox Code Playgroud)
这个图像在这个帖子中得到了很好的接收(我已经测试了10,000左右,看起来很好).
runRxThread变量是通过定义线程函数的类中的一些setter函数设置的.
当我在主线程中运行一个进程时,例如:
startRx(); //start the thread
/*process to stimulate the sending of network data from another program*/
stopRX(); //stop the thread from accessing the queue
queue.clear();
Run Code Online (Sandbox Code Playgroud)
由clear()引起的段错误.我已经检查过它肯定是这条线而不是对象的内部管道,它绝对是.
它似乎是一个线程安全问题,但我不知道如何解决它,更重要的是,我不知道为什么.我的理解是两个线程可以写入同一个内存,但不能同时写入.当然,通过设置我的runRxThread变量,我确保不会发生这种情况.
我非常想要一个不涉及互斥锁或信号量的解决方案 - 我真的不认为它们对于像这样的问题是必要的.
谢谢!
编辑:runRXThread是volatile并且线程循环现在是:
while(1){
if(runRxThread == 1){
this->rxImage();
}
}
Run Code Online (Sandbox Code Playgroud)
EDIT2:"在共享对象上使用互斥锁"
好吧,这显然是一个线程安全问题,我需要让我的共享变量线程安全.但...
1)rxImage(); 除非有数据发送,否则不会终止
2)段错误发生在rxImage()中;
3)如果我用互斥锁锁定队列,那么程序肯定会在rxImage中挂起,直到有数据,因为互斥锁不会被释放
4)没有数据发送,所以程序将永远挂起.
我的理解不正确吗?
EDIT3:
我已将rxImage()更改为非阻塞:
zmq::message_t img;
imageSocket->recv(&img,ZMQ_NOBLOCK); …Run Code Online (Sandbox Code Playgroud) 我有一个二进制数据的3D数组.我想把它投射到3个2D图像 - 侧面,正面,鸟眼.
我写了代码:
for x in range(data.shape[2]):
for y in range(data.shape[0]):
val = 0
for z in range(data.shape[1]):
if data[y][z][x] > 0:
val = 255
break
side[y][x] = val
Run Code Online (Sandbox Code Playgroud)
但对于~700x300x300矩阵来说,这是非常缓慢的(75秒!).
实现此任务的最快方法是什么?
编辑:
为了保存图像,我使用了:
sideImage = Image.fromarray(side)
sideImage.convert('RGB').save("sideImage.png")
Run Code Online (Sandbox Code Playgroud) 以下代码:
filePath = os.path.join(root,file)
image = cv2.imread(filePath)
convertedImage = cv2.cvtColor(image, cv2.COLOR_BAYER_GR2RGB)
Run Code Online (Sandbox Code Playgroud)
产生这个错误:
opencv\modules\imgproc\src\color.cpp:4196: error: (-215) scn == 1 && dcn == 3 in function cv::cvtColor
Run Code Online (Sandbox Code Playgroud)
这个错误是什么意思(除了说明源和目标中的通道数)?我怎样才能解决这个问题?是否与我加载图像的方式有关?