HObject和Mat住那换

本文详细介绍了如何使用OpenCV与Halcon库进行图像数据的相互转换。提供了从Halcon的HObject类型到OpenCV的cv::Mat类型的转换函数`HImageToCVImage`,以及反向转换的函数`CVImageToHImage`。在转换过程中,注意了OpenCV的BGR颜色通道顺序与Halcon的RGB顺序的区别。这些函数对于在两者之间进行图像处理和分析具有重要意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cv::Mat HImageToCVImage(HalconCpp::HObject &h_image) {
	cv::Mat cv_image;
	HalconCpp::HTuple h_channels;
	HalconCpp::HTuple h_row{ 0 }, h_col{ 0 };
	HalconCpp::ConvertImageType(h_image, &h_image, "byte");
	HalconCpp::CountChannels(h_image, &h_channels);
	HalconCpp::HTuple h_gray_value;
	if (h_channels.I() == 1) {
		HalconCpp::GetImageSize(h_image, &h_col, &h_row);
		cv_image = cv::Mat::zeros(h_row.I(), h_col.I(), CV_8UC1);
		for (int i = 0; i < h_row.I(); ++i) {
			for (int j = 0; j < h_col.I(); ++j) {
				HalconCpp::GetGrayval(h_image, i, j, &h_gray_value);
				cv_image.at<uchar>(i, j) = static_cast<uchar>(h_gray_value.I());
			}
		}
	}
	else if (h_channels.I() == 3) {
		HalconCpp::GetImageSize(h_image, &h_col, &h_row);
		cv_image = cv::Mat::zeros(h_row.I(), h_col.I(), CV_8UC3);
		for (int i = 0; i < h_row.I(); ++i) {
			for (int j = 0; j < h_col.I(); ++j) {
				HalconCpp::GetGrayval(h_image, i, j, &h_gray_value);
				// Warning: OpenCV's color image channel order is BGR, not RGB!!!
				cv_image.at<uchar>(i, j * 3) = static_cast<uchar>(h_gray_value[2].I()); //blue color
				cv_image.at<uchar>(i, j * 3 + 1) = static_cast<uchar>(h_gray_value[1].I()); //green color
				cv_image.at<uchar>(i, j * 3 + 2) = static_cast<uchar>(h_gray_value[0].I()); //red color
			}
		}
	}
	return cv_image;
}

void HImageToCVImage(HalconCpp::HObject &h_image, cv::Mat &cv_image) {
	HalconCpp::HTuple h_channels;
	HalconCpp::HTuple h_row{ 0 }, h_col{ 0 };
 	HalconCpp::ConvertImageType(h_image, &h_image, "byte");
	HalconCpp::CountChannels(h_image, &h_channels);
	HalconCpp::HTuple h_gray_value;
	if (h_channels.I() == 1) {
		HalconCpp::GetImageSize(h_image, &h_col, &h_row);
		cv_image = cv::Mat::zeros(h_row.I(), h_col.I(), CV_8UC1);
		for (int i = 0; i < h_row.I(); ++i) {
			for (int j = 0; j < h_col.I(); ++j) {
				HalconCpp::GetGrayval(h_image, i, j, &h_gray_value);
				cv_image.at<uchar>(i, j) = static_cast<uchar>(h_gray_value.I());
			}
		}
	}
	else if (h_channels.I() == 3) {
		HalconCpp::GetImageSize(h_image, &h_col, &h_row);
		cv_image = cv::Mat::zeros(h_row.I(), h_col.I(), CV_8UC3);
		for (int i = 0; i < h_row.I(); ++i) {
			for (int j = 0; j < h_col.I(); ++j) {
				HalconCpp::GetGrayval(h_image, i, j, &h_gray_value);
				// Warning: OpenCV's color image channel order is BGR, not RGB!!!
				cv_image.at<uchar>(i, j * 3) = static_cast<uchar>(h_gray_value[2].I()); //blue color
				cv_image.at<uchar>(i, j * 3 + 1) = static_cast<uchar>(h_gray_value[1].I()); //green color
				cv_image.at<uchar>(i, j * 3 + 2) = static_cast<uchar>(h_gray_value[0].I()); //red color
			}
		}
	}
}

HalconCpp::HObject CVImageToHImage(cv::Mat &cv_image) {
	HalconCpp::HObject h_image;
	if (cv_image.channels() == 3) {
		size_t length = static_cast<size_t>(cv_image.rows * cv_image.cols);
		uchar *BlueData = new uchar[length];
		uchar *GreenData = new uchar[length];
		uchar *RedData = new uchar[length];
		for (int i = 0; i < cv_image.rows; ++i) {
			uchar *ptr = cv_image.ptr<uchar>(i);
			for (int j = 0; j < cv_image.cols; ++j) {
				BlueData[i * cv_image.cols + j] = ptr[3 * j];
				GreenData[i * cv_image.cols + j] = ptr[3 * j + 1];
				RedData[i * cv_image.cols + j] = ptr[3 * j + 2];
			}
		}
		HalconCpp::GenImage3(&h_image,
			"byte",
			cv_image.cols,
			cv_image.rows,
			reinterpret_cast<Hlong>(RedData),
			reinterpret_cast<Hlong>(GreenData),
			reinterpret_cast<Hlong>(BlueData));
		delete[] RedData;
		delete[] GreenData;
		delete[] BlueData;
	}
	else if (cv_image.channels() == 1) {
		uchar *GrayData = new uchar[static_cast<size_t>(cv_image.rows * cv_image.cols)];
		memcpy(GrayData, cv_image.data, static_cast<size_t>(cv_image.rows * cv_image.cols));
		HalconCpp::GenImage1(&h_image, "byte", cv_image.cols, cv_image.rows, reinterpret_cast<Hlong>(GrayData));
		delete[] GrayData;
	}
	return h_image;
}

void CVImageToHImage(cv::Mat &cv_image, HalconCpp::HObject &h_image) {
	if (cv_image.channels() == 3) {
		std::vector<cv::Mat> BgrVector(3);
		cv::split(cv_image, BgrVector);
		size_t size = static_cast<size_t>(cv_image.rows * cv_image.cols);
		uchar *BlueData = new uchar[size];
		uchar *GreenData = new uchar[size];
		uchar *RedData = new uchar[size];
		memcpy(BlueData, BgrVector[0].data, size);
		memcpy(GreenData, BgrVector[1].data, size);
		memcpy(RedData, BgrVector[2].data, size);
		HalconCpp::GenImage3(&h_image,
			"byte",
			cv_image.cols,
			cv_image.rows,
			reinterpret_cast<Hlong>(RedData),
			reinterpret_cast<Hlong>(GreenData),
			reinterpret_cast<Hlong>(BlueData));
		delete[] RedData;
		delete[] GreenData;
		delete[] BlueData;
	}
	else if (cv_image.channels() == 1) {
		uchar *GrayData = new uchar[static_cast<size_t>(cv_image.rows * cv_image.cols)];
		memcpy(GrayData, cv_image.data, static_cast<size_t>(cv_image.rows * cv_image.cols));
		HalconCpp::GenImage1(&h_image, "byte", cv_image.cols, cv_image.rows, reinterpret_cast<Hlong>(GrayData));
		delete[] GrayData;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值