using OpenCvSharp;
using OpenCvSharp.Extensions;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
private static byte[] rgbValues;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void pictureBox1_Click(object sender, EventArgs e)
{
}
private void btnSelectImg1_Click(object sender, EventArgs e)
{
OpenFileDialog openFi = new OpenFileDialog();//定義用戶打開檔案的對話框
openFi.Filter = "影像檔案(JPeg, Gif, Bmp, etc.)|*.jpg;*.jpeg;*.gif;*.bmp;*.tif; *.tiff; *.png| JPeg 影像檔案(*.jpg;*.jpeg)"
+ "|*.jpg;*.jpeg |GIF 影像檔案(*.gif)|*.gif |BMP影像檔案(*.bmp)|*.bmp|Tiff影像檔案(*.tif;*.tiff)|*.tif;*.tiff|Png影像檔案(*.png)"
+ "| *.png |所有檔案(*.*)|*.*";//用戶打開檔案型別
if (openFi.ShowDialog() == DialogResult.OK)//打開的對話框是可以執行的,執行下面陳述句
{
txtImg1.Text = openFi.FileName;//打開檔案的路徑名在txtImg1文本上顯示
pbImg1.Image = Image.FromFile(openFi.FileName);//在pbImg的顯示的影像是輸入路徑指定檔案
//pbImg1.BackgroundImage = Image.FromFile(openFi.FileName);
}
}
private void btnSelectImg2_Click(object sender, EventArgs e)
{
OpenFileDialog openFi = new OpenFileDialog();
openFi.Filter = "影像檔案(JPeg, Gif, Bmp, etc.)|*.jpg;*.jpeg;*.gif;*.bmp;*.tif; *.tiff; *.png| JPeg 影像檔案(*.jpg;*.jpeg)"
+ "|*.jpg;*.jpeg |GIF 影像檔案(*.gif)|*.gif |BMP影像檔案(*.bmp)|*.bmp|Tiff影像檔案(*.tif;*.tiff)|*.tif;*.tiff|Png影像檔案(*.png)"
+ "| *.png |所有檔案(*.*)|*.*";
if (openFi.ShowDialog() == DialogResult.OK)
{
txtImg2.Text = openFi.FileName;
pbImg2.Image = Image.FromFile(openFi.FileName);
//pbImg2.Image = new Bitmap(openFi.OpenFile());//對pbImg2的圖片進行全部顯示,只能讀取
}
}
private void btnStart1_Click(object sender, EventArgs e)
{
string strImg1 = txtImg1.Text.Trim();//存盤txtImg1文本的路徑,除去文本中路徑中的多余的空格
string strImg2 = txtImg2.Text.Trim();
if (string.IsNullOrEmpty(strImg1))//判斷strImg1中是否為null(空)與string.Empty字串(" ")
{
MessageBox.Show("請選擇圖片1");
return;
}
if (string.IsNullOrEmpty(strImg2))
{
MessageBox.Show("請選擇圖片2");
return;
}
Image image1 = Image.FromFile(strImg1);//創建image1物件,用來存盤影像1
Image image2 = Image.FromFile(strImg2);
pbResult.BackgroundImage = null;//定義結果圖顯示的背景影像為空
Mat srcImg1 = new Mat(strImg1);//創建Mat類的srcImg1的物件
Mat srcImg2 = new Mat(strImg2);
Mat[] images = new Mat[] { srcImg1, srcImg2 };//將srcImg1, srcImg2放入Mat類的images陣列
Stitcher stitcher = Stitcher.Create(Stitcher.Mode.Panorama);
/*創建在其中一種縫合模式下配置的縫合器。
* 模式: 縫合手術場景。這通常由影像的來源決定縫合和他們的轉變。
* 將選擇默認引數進行操作在給定的場景。
組合掃描的模式。不期望影像在仿射變換下
//默認補償曝光。*/
Mat pano = new Mat();
var status = stitcher.Stitch(images, pano);//嘗試縫合給定的影像//拼接。
if (status != Stitcher.Status.OK)
{
MessageBox.Show("失敗:" + status.ToString());
return;
}
pbResult.Image = BitmapConverter.ToBitmap(pano);
//pbResult.BackgroundImage = BitmapConverter.ToBitmap(pano);
}
/// <summary>
/// 普通拼接:將已經選擇好的圖片一與圖片二進行上下還是左右拼接
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
string strImg1 = txtImg1.Text.Trim();
string strImg2 = txtImg2.Text.Trim();
if (string.IsNullOrEmpty(strImg1))
{
MessageBox.Show("請選擇圖片1");
return;
}
if (string.IsNullOrEmpty(strImg2))
{
MessageBox.Show("請選擇圖片2");
return;
}
int type = rcbType1.Checked ? 1 : 0;//1=上下拼接,0=左右拼接
Image image1 = Image.FromFile(strImg1);
Image image2 = Image.FromFile(strImg2);
if (type == 1)
{
if (image1.Width != image2.Width)
{
MessageBox.Show("圖片寬度不一致");
return;
}
}
else
{
if (image1.Height != image2.Height)
{
MessageBox.Show("圖片高度不一致");
return;
}
}
pbResult.BackgroundImage = null;
Mat srcImg1 = new Mat(strImg1);
Mat srcImg2 = new Mat(strImg2);
Mat ret = new Mat();
if (type == 1)
{//上下拼接
Cv2.VConcat(srcImg1, srcImg2, ret); //對給定的矩陣應用垂直連接。
}
else
{//左右拼接
Cv2.HConcat(srcImg1, srcImg2, ret); //對給定的矩陣應用水平連接
}
pbResult.Image = BitmapConverter.ToBitmap(ret);//將Mat轉換為System.Drawing.Bitmap
//pbResult.BackgroundImage = BitmapConverter.ToBitmap(ret);
}
private void btnSave_Click(object sender, EventArgs e)
{
//if (pbResult.BackgroundImage == null)
//{
// MessageBox.Show("結果圖為空");
// return;
//}
SaveFileDialog savedialog = new SaveFileDialog();
savedialog.Filter = "Jpg 圖片|*.jpg|Bmp 圖片|*.bmp|Png 圖片|*.png";
savedialog.FilterIndex = 0;
savedialog.RestoreDirectory = true;//保存對話框是否記憶上次打開的目錄
savedialog.CheckPathExists = true;//檢查目錄
savedialog.FileName = System.DateTime.Now.ToString("yyyyMMddHHmmss") + "-"; ;//設定默認檔案名
if (savedialog.ShowDialog() == DialogResult.OK)
{
pbResult.Image.Save(savedialog.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);// image為要保存的圖片
MessageBox.Show(this, "圖片保存成功!", "資訊提示");
}
}
}
}
圖片1:
圖片2:
合成的圖片:
我是初學的,求大佬解決影像拼接的黑邊問題
黑邊問題可以用c#解決嗎?或者呼叫什么?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/246691.html
標籤:C#



