我正在尝试选择网络摄像头帧的像素颜色。所以我在ImageBox中捕获帧然后没有任何问题。但是,当我双击ImageBox时,当我尝试访问存储在ImageBox上的图像时,我得到了一个CvException。当我尝试获取图像的像素时弹出异常。
OpenCV:无法识别或不支持的数组类型
这就是我捕捉帧的方式:
// On Form Load
Application.Idle += ProcessFrame;
private void ProcessFrame(object sender, EventArgs arg)
{
if (cap != null)
{
using (Image<Bgr, byte> frame = cap.QueryFrame())
{
if (frame != null)
{
imageFrame = frame;
imageBoxFrame.Image = imageFrame;
Bgr color = imageFrame[50, 100];
}
}
}
}
在DoubleClick Event中:
private void imageBoxFrame_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (treeViewObjects.SelectedNode is ColorNode && !isTracking)
{
if (imageFrame == null)
return;
Emgu.CV.UI.ImageBox imageBox = (Emgu.CV.UI.ImageBox)sender;
Image<Bgr, byte> image = (Image<Bgr, byte>)imageBox.Image;
Bgr color = image[e.X, e.Y]; // This line causes the Exception
}
}
显然图像不为空。 我做错了什么?也许有线程的东西?
答案 0 :(得分:3)
(通过OP和答复发布的问题回答了问题。请参阅Question with no answers, but issue solved in the comments (or extended in chat))
OP写道:我解决了。
我只需要克隆图像,因为using语句擦除了图像数据。所以,在ProcessEvent上我只需要将帧克隆到imageFrame。
imageFrame = frame.Clone();
还有另一个问题。访问像素数据的正确方法是[Y,X]而不是[X,Y]。
Bgr color = image[e.Y, e.X];