将C++ IplImage 图像用C#读取(二)
来源:互联网 发布:哪里可以买淘宝号 编辑:程序博客网 时间:2024/05/17 23:29
上一篇 将C++ IplImage 图像用C#读取 的方法只适用于自己的电脑,而如果是将工程放到别的计算机,debug版本可以工作
release 版本就不能正常工作了,原因在于指针。具体的可以自己学习了解。(目前发现,部分电脑能用,部分不能用,有知道的可以告诉我下是什么问题,谢谢了
-----已经解决
因为少了一个tbb.dll,现在别人电脑可以使用了。但是单独的dependency看不出来,后来用的是procexp,对比别人的电脑和我的电脑dll的差别看出来的,上一篇的方法应该没有问题)
这次我换一种方法,供大家参考。
此方法经过其他机器的测试
CvMat 可以用类似的方法转换。
dll 代码
#include "stdafx.h"#define DLL_API extern "C" _declspec(dllexport) #include <opencv2\opencv.hpp>DLL_API IplImage* _stdcall test(char* fileName){IplImage* src = cvLoadImage(fileName);return src;}
测试程序
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using Emgu.CV;using Emgu.CV.Structure;using Emgu.Util;using System.Runtime.InteropServices;namespace 1{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } [DllImport("1.dll")] // unsafe public static extern IntPtr test(string fileName); //unsafe private void button1_Click(object sender, EventArgs e) { OpenFileDialog open = new OpenFileDialog(); if (open.ShowDialog() == DialogResult.OK) { IntPtr pp = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(MIplImage))); pp = test(open.FileName); MIplImage d = (MIplImage)Marshal.PtrToStructure((IntPtr)(pp.ToInt32()), typeof(MIplImage)); IntPtr aa = new IntPtr(); aa = d.imageData; int width = d.width; int step = d.widthStep; int height = d.height; using (Image<Bgr, byte> src = new Image<Bgr, byte>(width, height, step, aa)) { pictureBox1.Image = src.ToBitmap(); } } } }}
下面是我按照C++的格式对应写的结构体 [StructLayout(LayoutKind.Sequential)] public struct MIplImage { // // 摘要: // sizeof(IplImage) public int nSize; // // 摘要: // version (=0) public int ID; // // 摘要: // Most of OpenCV functions support 1,2,3 or 4 channels public int nChannels; // // 摘要: // ignored by OpenCV public int alphaChannel; // // 摘要: // pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U, IPL_DEPTH_16S, // IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported public IPL_DEPTH depth; // // 摘要: // ignored by OpenCV public byte colorModel0; // // 摘要: // ignored by OpenCV public byte colorModel1; // // 摘要: // ignored by OpenCV public byte colorModel2; // // 摘要: // ignored by OpenCV public byte colorModel3; // // 摘要: // ignored by OpenCV public byte channelSeq0; // // 摘要: // ignored by OpenCV public byte channelSeq1; // // 摘要: // ignored by OpenCV public byte channelSeq2; // // 摘要: // ignored by OpenCV public byte channelSeq3; // // 摘要: // 0 - interleaved color channels, 1 - separate color channels. cvCreateImage // can only create interleaved images public int dataOrder; // // 摘要: // 0 - top-left origin, 1 - bottom-left origin (Windows bitmaps style) public int origin; // 摘要: // Alignment of image rows (4 or 8). OpenCV ignores it and uses widthStep instead public int align; // // 摘要: // image width in pixels public int width; // // 摘要: // image height in pixels public int height; // // 摘要: // image ROI. when it is not NULL, this specifies image region to process public IntPtr roi; // // 摘要: // must be NULL in OpenCV public IntPtr maskROI; // // 摘要: // ditto public IntPtr imageId; // // 摘要: // ditto public IntPtr tileInfo; // // 摘要: // image data size in bytes (=image->height*image->widthStep in case of interleaved // data) public int imageSize; // // 摘要: // pointer to aligned image data public IntPtr imageData; // // 摘要: // size of aligned image row in bytes public int widthStep; // // 摘要: // border completion mode, ignored by OpenCV public int BorderMode0; // // 摘要: // border completion mode, ignored by OpenCV public int BorderMode1; // // 摘要: // border completion mode, ignored by OpenCV public int BorderMode2; // // 摘要: // border completion mode, ignored by OpenCV public int BorderMode3; // // 摘要: // border const, ignored by OpenCV public int BorderConst0; // // 摘要: // border const, ignored by OpenCV public int BorderConst1; // // 摘要: // border const, ignored by OpenCV public int BorderConst2; // // 摘要: // border const, ignored by OpenCV public int BorderConst3; // // 摘要: // pointer to a very origin of image data (not necessarily aligned) - it is // needed for correct image deallocation public IntPtr imageDataOrigin; }
对于不用EMGUCV的人 可以自己复制一个MIplImage 的结构体
这里还需要DEPTH这个类
public enum IPL_DEPTH { // 摘要: // 1bit unsigned IPL_DEPTH_1U = 1, // // 摘要: // 8bit unsigned (Byte) IPL_DEPTH_8U = 8, // // 摘要: // 16bit unsigned IPL_DEPTH_16U = 16, // // 摘要: // 32bit float (Single) IPL_DEPTH_32F = 32, // // 摘要: // double IPL_DEPTH_64F = 64, // // 摘要: // indicates if the value is signed IPL_DEPTH_SIGN = 0x80000000, // // 摘要: // 8bit signed IPL_DEPTH_8S = IPL_DEPTH_SIGN| 8, // // 摘要: // 16bit signed IPL_DEPTH_16S = IPL_DEPTH_SIGN|16, // // 摘要: // 32bit signed IPL_DEPTH_32S = IPL_DEPTH_SIGN|32, }
对于灰度图像需要添加一个类方法:
public static class CvToolbox { // #region Color Pallette /// <summary> /// The ColorPalette of Grayscale for Bitmap Format8bppIndexed /// </summary> public static readonly ColorPalette GrayscalePalette = GenerateGrayscalePalette(); private static ColorPalette GenerateGrayscalePalette() { using (Bitmap image = new Bitmap(1, 1, PixelFormat.Format8bppIndexed)) { ColorPalette palette = image.Palette; for (int i = 0; i < 256; i++) { palette.Entries[i] = Color.FromArgb(i, i, i); } return palette; } } }
aa = d.imageData; int height = d.height; int step = d.widthStep; Bitmap img = new Bitmap(width, height, step, System.Drawing.Imaging.PixelFormat.Format8bppIndexed, aa); img.Palette = CvToolbox.GrayscalePalette; bigImage.Image = img;
1、将Mat转换为IplImage
//! converts header to IplImage; no data is copied
operator IplImage() const;
举例:Mat img;
IplImage *src;
src=&IplImage(img);
2、将IplImage转换为Mat
//! converts old-style IplImage to the new matrix; the data is not copied by default
Mat(const IplImage* img, bool copyData=false);
0 0
- 将C++ IplImage 图像用C#读取(二)
- 将C++ IplImage 图像用C#读取
- 【opencv】 图像的创建,读取,显示 IplImage,Mat类型转化
- C#图像读取
- 将yuyv格式图像转为IplImage(彩色)
- 图像处理-将uchar*数据转换成Mat,Iplimage*
- OpenCV中的三种图像数据结构CvMat, IplImage和Mat(二)IplImage
- c#读取图像灰度值
- 二 读取、显示、存储图像
- opencv 图像显示IplImage
- IplImage图像显示出错
- opecv IplImage加载图像
- IplImage 加载图像
- OpenCV用GDI或者GDI+函数对IplImage图像处理
- 如何将读取到内存中的BMP图片转换为IplImage
- C# 读取html内容二
- c# 图像读取几种方法
- c# 图像读取几种方法
- 手把手教你如何把java代码,打包成jar文件以及转换为exe可执行文件
- 营养学家推荐多吃14种超级食物
- 视频直播服务器
- Prim算法介绍与实现
- iOS多线程编程指南(四)线程同步
- 将C++ IplImage 图像用C#读取(二)
- iOS多线程编程指南(附录)
- 一个人应该活得是自己并且干净
- Nagios监控平台之四:监控Linux服务器CPU温度
- 从头到尾实现vector
- hibernate 学习笔记三(session的使用)sessionfaction的介绍 get和load的区别
- Nagios监控平台之五:监控Windows服务器
- 《AngularJS》5个实例详解Directive(指令)机制
- u-boot.lds 文件分析 .