在opencv(c#)中从摄影机提取文本
我写了一些代码,用于从照相机中查找文本。实际上,我第一次编写了在图像中查找文本的代码,我成功了,但我无法从相机中找到文本。 先谢谢你。 此外,我在类库中编写了这段代码,因此无法很好地测试它在opencv(c#)中从摄影机提取文本,c#,opencv,image-processing,video-processing,opencvsharp,C#,Opencv,Image Processing,Video Processing,Opencvsharp,我写了一些代码,用于从照相机中查找文本。实际上,我第一次编写了在图像中查找文本的代码,我成功了,但我无法从相机中找到文本。 先谢谢你。 此外,我在类库中编写了这段代码,因此无法很好地测试它 public string GetImageText(string imgPath) { pathImage = imgPath; //CvCapture cap = new CvCapture(0); CvCapture cap; /
public string GetImageText(string imgPath)
{
pathImage = imgPath;
//CvCapture cap = new CvCapture(0);
CvCapture cap;
//CvCapture cap = new CvCapture(imgPath);
cap = CvCapture.FromFile(imgPath);
cap= CvCapture.FromCamera(CaptureDevice.Any);
// img = new IplImage(imgPath, LoadMode.Color);
// cap =CvCapture.FromFile(imgPath);
// IplImage frame = new IplImage();
// imgPath=cap.QueryFrame(frame);
frame = cap.QueryFrame();
// IplImage frame = new IplImage();
// BitmapConverter.ToBitmap(frame);
//frame = new IplImage(imgPath, LoadMode.Color);
if (frame != null)
{
IplImage img1 = new IplImage(frame.Size, BitDepth.U8, 1);
IplConvKernel element = Cv.CreateStructuringElementEx(21, 3, 10, 2, ElementShape.Rect, null);
aimg = new IplImage(frame.Size, BitDepth.U8, 1);
IplImage temp = aimg.Clone();
IplImage dest = aimg.Clone();
frame.CvtColor(aimg, ColorConversion.RgbaToGray);
bimg = aimg.Clone();
Cv.Smooth(aimg, aimg, SmoothType.Gaussian);
Cv.MorphologyEx(aimg, temp, dest, element, MorphologyOperation.TopHat, 1);
Cv.Threshold(dest, aimg, 128, 255, ThresholdType.Binary | ThresholdType.Otsu);
Cv.Smooth(aimg, dest, SmoothType.Median);
Cv.Dilate(dest, dest, element, 2);
Cv.ReleaseImage(temp);
Cv.ReleaseImage(dest);
IplImage labelImage = new IplImage(frame.Size, CvBlobLib.DepthLabel, 1);
labelImage = new IplImage(frame.Size, BitDepth.U8, 1);
frame = new IplImage(frame.Size, BitDepth.U8, 1);
blob = new CvBlobs();
text.Clear();
CvBlobLib.Label(labelImage, blob);
CvBlobLib.FilterByArea(blob, 6, 10);
IplImage imgtemp = frame.Clone();
foreach (var item in blob)
{
item.Value.SetImageRoiToBlob(bimg);
double ratio = (double)item.Value.Rect.Width / item.Value.Rect.Height;
double angle = (double)item.Value.Angle();
if (ratio > 3.5 && ratio < 5.4 && angle > -15 && angle < 15)
{
IplImage texttemp = new IplImage(new CvSize(140, 27), bimg.Depth, bimg.NChannels);
// texttemp.Flip( null , FlipMode.X );
Cv.Resize(bimg, texttemp);
text.Add(texttemp);
frame.Rectangle(item.Value.Rect, new CvScalar(0, 0, 255), 2, LineType.Link4);
// frame.Flip(null, FlipMode.X);
// frame.Rectangle(item.Value.Rect, new CvScalar(0, 0, 255), 2, LineType.Link4)=RotateFlipType.Rotate180FlipNone()
// RotateFlipType.Rotate180FlipX(frame.Rectangle(item.Value.Rect, new CvScalar(0, 0, 255), 2, LineType.Link4));
// flipImage=frame.Rectangle(item.Value.Rect, new CvScalar(0, 0, 255), 2, LineType.Link4);
}
}
textList.Clear();
}
return pathImage;
}
公共字符串GetImageText(字符串imgPath)
{
路径图像=imgPath;
//CvCapture cap=新CvCapture(0);
捕获帽;
//CvCapture cap=新的CvCapture(imgPath);
cap=CvCapture.FromFile(imgPath);
cap=CvCapture.FromCamera(CaptureDevice.Any);
//img=新的IplImage(imgPath,LoadMode.Color);
//cap=CvCapture.FromFile(imgPath);
//IplImage框架=新IplImage();
//imgPath=cap.QueryFrame(frame);
frame=cap.QueryFrame();
//IplImage框架=新IplImage();
//BitmapConverter.ToBitmap(帧);
//frame=新的IplImage(imgPath,LoadMode.Color);
如果(帧!=null)
{
IplImage img1=新的IplImage(frame.Size,BitDepth.U8,1);
IplConvKernel元素=Cv.CreateStructuringElementEx(21,3,10,2,ElementShape.Rect,null);
aimg=新IplImage(frame.Size,BitDepth.U8,1);
IplImage temp=aimg.Clone();
IplImage dest=aimg.Clone();
frame.CvtColor(aimg,ColorConversion.RgbaToGray);
bimg=aimg.Clone();
Cv.Smooth(aimg,aimg,SmoothType.Gaussian);
Cv.MorphologyEx(目标、温度、目的地、元素、形态操作1);
Cv.阈值(dest,aimg,128,255,ThresholdType.Binary | ThresholdType.Otsu);
等速平滑(aimg、dest、SmoothType、中值);
Cv.扩张(目的地,目的地,元素,2);
Cv.ReleaseImage(温度);
Cv.ReleaseImage(目的地);
IplImage labelImage=新IplImage(frame.Size,CvBlobLib.DepthLabel,1);
labelImage=新IplImage(frame.Size,BitDepth.U8,1);
frame=新的IplImage(frame.Size,BitDepth.U8,1);
blob=新的CVBLOB();
text.Clear();
CvBlobLib.标签(标签图像,blob);
CvBlobLib.FilterByArea(blob,6,10);
IplImage imgtemp=frame.Clone();
foreach(blob中的var项目)
{
项目值设置图像ROITOBLOB(bimg);
双重比率=(双重)item.Value.Rect.Width/item.Value.Rect.Height;
双角度=(双)item.Value.angle();
如果(比率>3.5&&比率<5.4&&角度>-15&&角度<15)
{
IplImage texttemp=新IplImage(新CvSize(140,27),双通道深度,双通道);
//texttemp.Flip(空,FlipMode.X);
Cv.调整大小(bimg、texttemp);
text.Add(texttemp);
frame.Rectangle(item.Value.Rect,新的CvScalar(0,0,255),2,线型.Link4);
//frame.Flip(空,FlipMode.X);
//frame.Rectangle(item.Value.Rect,新的CvScalar(0,0,255),2,LineType.Link4)=RotateFlipType.Rotate180FlipNone()
//RotateFlipType.Rotate180FlipX(frame.Rectangle(item.Value.Rect,新的CvScalar(0,0,255),2,LineType.Link4));
//flipImage=frame.Rectangle(item.Value.Rect,新的CvScalar(0,0,255),2,线型.Link4);
}
}
textList.Clear();
}
返回路径图像;
}
我没有评论所需的声誉,因此必须以回答的形式进行评论。在您完成所有查找文本的处理后,pathImage似乎没有得到任何值-它保留imgPath的值,因此您只需返回输入的相同值。感谢您的注释Pathımage获得值,但我放弃在此处添加这些代码。此外,当我放入调试时,我的代码将进行所有处理:(如果你想在这里添加这些代码,可以在这里添加更多代码之前查看以下链接:非常感谢,但我读了它,我们的问题和代码不同,但ı会再读一遍。我对此不太了解,无法提供帮助,但如果你无法调试,你应该添加一些日志来帮助你。例如:IplImage imgTemp=frame、 Clone();Console.Writeline(“frame的值是”+frame.someProperty);Console.Writeline(“temp的值是”+imgTemp.someProperty);
谢谢,但我可以调试,代码正在进入所有处理过程,所以我不知道我的错误在哪里