初学视觉学习笔记----保存并显示图片(打开两个相机)

以下代码可以实现的功能:

打开两个相机;抓拍图片以及获取图片的其他信息(如创建的时间);图像处理并把结果显示在hWindowCountrl;把图像在PicBox上显示(图片适应窗口大小);

查看原图(窗口适应图片的大小)//我觉得这个方法不太好用,再学习学习,找机会修改一下。

用到的相机:

USB相机,S500A3B高拍仪(或者笔记本自带相机)

楼主还是一个小白,程序可能写的不好,但是均在自己电脑上运行成功^^,有需要的可以按需自取。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using HalconDotNet;
using System.Threading;
using System.Drawing.Imaging;
namespace 分别打开两个相机
{
public partial class Form1 : Form
{

Thread t;
public bool tFlag = false;

//halcon变量
public HTuple hv_ExpDefaultWinHandle1;
public HTuple hv_ExpDefaultWinHandle2;
public HObject GPY_Image = null;
public HObject USB_Image = null;

public HTuple USB_AcqHandle = null;
public HTuple GPY_AcqHandle = null;

public HTuple USB_Width = new HTuple();
public HTuple USB_Height = new HTuple();

public HTuple GPY_Width = new HTuple();
public HTuple GPY_Height = new HTuple();

//图片属性
HTuple hv_Pointer = null, hv_Type = null, hv_Width1 = null;
HTuple hv_Height1 = null, hv_MSecond = null, hv_Second = null;
HTuple hv_Minute = null, hv_Hour = null, hv_Day = null;
HTuple hv_YDay = null, hv_Month = null, hv_Year = null;

//截图变量
public HTuple hv_ExpDefaultWinHandle3;
public HTuple WindowHandle;
public HTuple WindowHandle1;
public HObject savepic;
public HObject ho_Image1;

public bool grabImg = false;
//图片保存的路径
public string filename = "C:/Users/like/Documents/Visual Studio 2015/Projects/分别打开两个相机/savepic/SavePic.jpg";

//图像处理
HTuple hv_ExpDefaultWinHandle4;
HSystem sys = new HSystem();
HObject ho_Regions = null;

//本例程打开了两个相机。侧重点 在打开USB相机,并获取USB相机的图片,然后进行图像处理。
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
hv_ExpDefaultWinHandle1 = hWindowControl1.HalconWindow;
hv_ExpDefaultWinHandle2 = hWindowControl2.HalconWindow;
hv_ExpDefaultWinHandle3 = hWindowControl3.HalconWindow;
hv_ExpDefaultWinHandle4 = hWindowControl4.HalconWindow;

HOperatorSet.GenEmptyObj(out USB_Image);
HOperatorSet.GenEmptyObj(out GPY_Image);
HOperatorSet.GenEmptyObj(out savepic);
HOperatorSet.GenEmptyObj(out ho_Regions);

//这句话很重要,设置颜色的数量,没有这句话图像处理结果显示为空
HOperatorSet.SetColored(hv_ExpDefaultWinHandle4, 12);

}

//结束程序
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (tFlag == true)
{
t.Abort();
}

if (MessageBox.Show("是否要退出本系统?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
{
this.Dispose(true);
this.Close();
Application.Exit();
base.OnClosing(e); //这句话有什么用,我不知道。。
}

}

//USB相机初始化程序
public void InitCameraUSB()
{

HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb",
-1, "false", "default", "[1] USB Camera", 0, -1, out USB_AcqHandle);
USB_Height = 480; //相机分辨率
USB_Width = 640;
HOperatorSet.SetPart(hv_ExpDefaultWinHandle1, 0, 0, USB_Height, USB_Width); //设置图像显示部分适应窗口
HOperatorSet.SetPart(hv_ExpDefaultWinHandle3, 0, 0, USB_Height, USB_Width);

}

//高拍仪的初始化
public void InitCameraGPY()
{

HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb",
-1, "false", "default", "[2] S500A3B", 0, -1, out GPY_AcqHandle);
GPY_Height = 2000;
GPY_Width = 2000;
HOperatorSet.SetPart(hv_ExpDefaultWinHandle2, 0, 0, GPY_Height, GPY_Width);
}

//USB相机的打开程序
public void StartUSB()
{

HOperatorSet.GrabImageStart(USB_AcqHandle, -1);
while (true)
{
try
{
USB_Image.Dispose();
HOperatorSet.GrabImageAsync(out USB_Image, USB_AcqHandle, -1);

HOperatorSet.DispObj(USB_Image, hv_ExpDefaultWinHandle1); //视频实时显示

if (grabImg == true) //grabImg是抓拍图片的标志,令grabImg=true时抓拍图片
{
grabImg = false;
HOperatorSet.DispObj(USB_Image, hv_ExpDefaultWinHandle3); //抓拍图显示
//把抓拍到的图片保存到计算机
HOperatorSet.WriteImage(USB_Image, "jpg", 0, filename);

}
}
catch
{
continue;
}
}
}

//高拍仪启动程序
public void StartGPY()
{
HOperatorSet.GrabImageStart(GPY_AcqHandle, -1);
while (true) //高拍仪实时显示
{
try
{
USB_Image.Dispose();
HOperatorSet.GrabImageAsync(out GPY_Image, GPY_AcqHandle, -1);
HOperatorSet.DispObj(GPY_Image, hv_ExpDefaultWinHandle2);
}
catch
{
continue;
}

}
}

//获取拍的照片的相关参数
public void getmessage()
{

HOperatorSet.GetImagePointer1(savepic, out hv_Pointer, out hv_Type, out hv_Width1,out hv_Height1);
HOperatorSet.GetImageTime(savepic, out hv_MSecond, out hv_Second, out hv_Minute, out hv_Hour, out hv_Day, out hv_YDay, out hv_Month, out hv_Year);

}

//图像处理过程,添加一些其他halcon算子,可以实现更复杂的图像处理。
public void threshold()
{

HOperatorSet.ClearWindow(hv_ExpDefaultWinHandle4);
ho_Regions.Dispose();
HOperatorSet.AutoThreshold(savepic, out ho_Regions, 4);
HOperatorSet.DispObj(ho_Regions, hv_ExpDefaultWinHandle4);

HOperatorSet.WriteString(hv_ExpDefaultWinHandle4, "处理图像");

}

//打开USB相机的事件
private void button1_Click(object sender, EventArgs e)
{
t = new Thread(new ThreadStart(StartUSB));
try
{
InitCameraUSB(); //初始化相机
}
catch
{
MessageBox.Show("打开USB相机失败", "请重试");
}

t.Start();
tFlag = true;
}

//打开高拍仪的事件
private void button2_Click(object sender, EventArgs e)
{
t = new Thread(new ThreadStart(StartGPY));
try
{
InitCameraGPY(); //初始化相机
}
catch
{
MessageBox.Show("打开高拍仪失败", "请重试");
}
t.Start();
}

//图像处理事件
private void button3_Click_1(object sender, EventArgs e)
{
threshold();
}

//获取图片信息事件
private void button4_Click(object sender, EventArgs e)
{
getmessage();
textBox1.Text = null;
textBox1.Text = "Pointer:" + hv_Pointer + "\r\n" + "Type :" + hv_Type + "\r\n" + "长宽 :" + hv_Height1 + "X" + hv_Width1 + "\r\n"+"PicTime:"+ "\r\n" + hv_Year + "年" + hv_Month + "月" + hv_Day + "日" + hv_Hour + "时" + hv_Minute + "分" + hv_Second + "秒";
}

//把原图放在PicBox内的事件
//方法:
//step1: picturebox 放在 panel里面
//step2: panel的AutoScroll 设置为true
private void button5_Click(object sender, EventArgs e)
{
HOperatorSet.GetImagePointer1(savepic, out hv_Pointer, out hv_Type, out hv_Width1, out hv_Height1);
pictureBox2.Width = hv_Width1;
pictureBox2.Height = hv_Height1;
HOperatorSet.OpenWindow(0, 0, pictureBox2.Width, pictureBox2.Height, pictureBox2.Handle, "visible", "", out WindowHandle1);
HOperatorSet.DispObj(savepic, WindowHandle1);
HOperatorSet.WriteString(WindowHandle1, "测试完成");
//下次再添加滚轮放大图片的效果
}

//抓取图片事件
private void button6_Click(object sender, EventArgs e)
{
grabImg = true; //抓取图片标志

//把保存的图片的内容读取到savepic中,为了下一步获取图片属性做准备
savepic.Dispose();
HOperatorSet.ReadImage(out savepic, filename);

}

//把图片放在PicBox内的事件
private void button7_Click(object sender, EventArgs e)
{
//用halcon的OpenWindow在PicBox内打开一个窗口
HOperatorSet.OpenWindow(0, 0, pictureBox1.Width, pictureBox1.Height, pictureBox1.Handle, "visible", "", out WindowHandle);
HOperatorSet.DispObj(savepic, WindowHandle);
}

}
}

提出问题:

http://www.ihalcon.com/read-7207.html

问题详情在帖子里有说T T,有没有大神可以帮我解解惑~

保存图片的功能可以改进

时间: 2024-10-13 06:47:27

初学视觉学习笔记----保存并显示图片(打开两个相机)的相关文章

Android学习笔记进阶之在图片上涂鸦(能清屏)

Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java [java] view plaincopy package xiaosi.handWriting; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import andro

python学习笔记-抓取网页图片脚本

初学者一枚,代码都是模仿网上的.亲测可用~ 运行脚本的前提是本机安装了httplib2模块 #!/usr/bin/python import os import re import string import urllib #author:reed #date:2014-05-14 def GetWebPictures(): url=raw_input('please input the website you want to download:') imgcontent=urllib.urlo

IOS开发-UI学习-根据URL显示图片,下载图片的练习(button,textfield,image view,url,data)

编写一个如下界面,实现: 1.在文本输入框中输入一个网址,然后点击显示图片,图片显示到UIImageView中. 2.点击下载,这张显示的图片被下载到手机的Documents文件夹下的Dowmload目录下,并按序号命名. 3.在文本框输入完成之后点击其他地方,键盘自动消失. 准备工作: 1.输入的URL有可能是http而非https,需要在Info.plist中添加如下代码: 1 <key>NSAppTransportSecurity</key> 2 <dict> 3

python 读取并显示图片的两种方法

在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1. 显示图片 import matplotlib.pyplot as plt # plt 用于显示图片 import matplotlib.image as mpimg # mpimg 用于读取图片 import numpy as np lena = mpimg.imread('lena.png')

初学c# -- 学习笔记(七) RichTextBox支持GIF

园子里许明吉博客写的一篇,刚好用到这个,写的非常好.转过来了 不过在应用中也有一些问题,win10下不能中文输入,凑合着进行了修改, 下面是原来的代码: private void button2_Click(object sender, EventArgs e) { IList<MemoryStream> _List = gifRichTextBox1.LoadSelectFile(); for (int i = 0; i != _List.Count; i++) { File.WriteAl

angularjs学习笔记一之显示数据,修改数据

1 <!doctype html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 5 <script type="text/javascript" src="js/angular.min.js"></script> 6 &l

HTML&amp;CSS基础学习笔记1.9-添加图片

<img>标签是用来添加图片的~ <img>标签的使用方法:<img src="图片的地址"> 先来看段实例代码: <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title></title></head><body><im

《Cocos2d-x游戏开发实战精解》学习笔记2--在Cocos2d-x中显示一行文字

在Cocos2d-x中要显示文字就需要用到Label控件.在3.x版本的Cocos2d中,舍弃了之前版本所使用的LabelTTF.LabelAtlas.LabelBMFont 3个用于显示文字的类,而使用一个新类Label取代.可想而知,Label实际上就是对之前3个类进行重新封装并统一渲染. 提示:实际上老版本的内容在3.x版本中依然是可以使用的. 下面是在Cocos2d-x中显示文字的一个例子,具体完整项目可在源文件本章目录下找到项目ChapterThree01查看. [范例3-1 在Coc

初学c# -- 学习笔记(二)

接着前面的学习,对话建立了,下面就写对话框气泡,和微信的差不多那种.尖角对话气泡网上一堆,圆尖角的修改了一个.IE8以下不能用,其他都可以用,直接上html代码,将<style>内容用到你的程序里面就能达到一样的效果,没用js文件,没用图片.强大的CSS3,真的很强大. html代码 <style> .Message_Left { width: auto; height: auto; margin-left: 200px; max-width:390px; min-width:90