Halcon 与 OpenCV 图像数据类型转换

来源:互联网 发布:java servlet菜鸟 编辑:程序博客网 时间:2024/05/24 07:27

在之前大神的Halcon 与 OpenCV 图像数据类型的转换过程中,使用了C 接口的 Halcon 函数,如 read_image()在C++接口中则为ReadImage();

由Help可知,Halcon 中 C 接口与 C++ 接口支持的数据类型并不完全一样,因为,本人需要在C++环境下开发,所以,之前的代码,许多地方不能

使用,所以,在前人的基础上,对代码进行修改,修改后进行测试,发现通过读取灰度值的方式与直接用指针操作,时间消耗差别不大,以代码中

的样本图片为例,以指针的形式进行访问,在 Halcon 转 OpenCV 的时间消耗为:600ms 左右,以读取灰度值的方式,也在600 ms 左右;

但由OpenCV 转 Halcon 时间消耗很少,大约只有 10 几 ms;

代码如下所示:

  #include <HalconCpp.h>  #include <opencv2/opencv.hpp>#include <iostream>#include <windows.h>using namespace std;using namespace HalconCpp;using namespace cv;HObject IplImageToHImage(cv::Mat& pImage);cv::Mat HImageToIplImage(HObject &Hobj);//IplImage* HImageToIplImage(HObject &Hobj);int main(int argc, char* argv[]){//Hobject Image, GrayImage;HObject Image, GrayImage;ReadImage(&Image, "lena.jpg");Rgb1ToGray(Image, &GrayImage);//Mat img = imread("lena.jpg");SYSTEMTIME tm;GetLocalTime(&tm);int t1 = tm.wSecond * 1000 + tm.wMilliseconds;//HObject hObj = IplImageToHImage(img);cv::Mat opencvImg = HImageToIplImage(GrayImage);GetLocalTime(&tm);int t2 = tm.wSecond * 1000 + tm.wMilliseconds;int t = t2 - t1;cout << "时间消耗:" << t << "ms" << endl;// HTuple winHandle;// HTuple w, h;// GetImageSize(hObj, &w, &h);// OpenWindow(0, 0, w, h, 0, "", "", &winHandle);// DispObj(hObj, winHandle);// int t1 = tm.wSecond * 1000 + tm.wMilliseconds;// // cv::Mat opencvImg = HImageToIplImage(Image);// // GetLocalTime(&tm);// int t2 = tm.wSecond * 1000 + tm.wMilliseconds;// // int t = t2 - t1;// // cout << "时间消耗为:" << t << "ms" << endl;namedWindow("img", 1);imshow("img", opencvImg);waitKey();system("pause");return 0;}cv::Mat HImageToIplImage(HObject &Hobj){//get_grayval(Image : : Row, Column : Grayval)cv::Mat pImage;HTuple htChannels;HTuple     width, height;width = height = 0;//转换图像格式  ConvertImageType(Hobj, &Hobj, "byte");CountChannels(Hobj, &htChannels);HTuple cType;HTuple grayVal;if (htChannels.I() == 1){GetImageSize(Hobj, &width, &height);pImage = cv::Mat(height, width, CV_8UC1);pImage = Mat::zeros(height, width, CV_8UC1);for (int i = 0; i < height.I(); ++i){for (int j = 0; j < width.I(); ++j){GetGrayval(Hobj, i, j, &grayVal); pImage.at<uchar>(i, j) = (uchar)grayVal.I();}}}else if (htChannels.I() == 3){GetImageSize(Hobj, &width, &height);pImage = cv::Mat(height, width, CV_8UC3);for (int row = 0; row < height.I(); row++){for (int col = 0; col < width.I(); col++){GetGrayval(Hobj, row, col, &grayVal);pImage.at<uchar>(row, col * 3) = (uchar)grayVal[2].I();pImage.at<uchar>(row, col * 3 + 1) = (uchar)grayVal[1].I();pImage.at<uchar>(row, col * 3 + 2) = (uchar)grayVal[0].I();}}}return pImage;}HObject IplImageToHImage(cv::Mat& pImage){HObject Hobj;if (3 == pImage.channels()){cv::Mat pImageRed, pImageGreen, pImageBlue;std::vector<cv::Mat> sbgr(3);cv::split(pImage, sbgr);int length = pImage.rows * pImage.cols;uchar *dataBlue = new uchar[length];uchar *dataGreen = new uchar[length];uchar *dataRed = new uchar[length];int height = pImage.rows;int width = pImage.cols;for (int row = 0; row < height; row++){uchar* ptr = pImage.ptr<uchar>(row);for (int col = 0; col < width; col++){dataBlue[row * width + col] = ptr[3 * col];dataGreen[row * width + col] = ptr[3 * col + 1];dataRed[row * width + col] = ptr[3 * col + 2];}}GenImage3(&Hobj, "byte", width, height, (Hlong)(dataRed), (Hlong)(dataGreen), (Hlong)(dataBlue));delete[] dataRed;delete[] dataGreen;delete[] dataBlue;}else if (1 == pImage.channels()){int height = pImage.rows;int width = pImage.cols;uchar *dataGray = new uchar[width * height];memcpy(dataGray, pImage.data, width * height);GenImage1(&Hobj, "byte", width, height, (Hlong)(dataGray));delete[] dataGray;}return Hobj;}


1 0
原创粉丝点击