C++ 实现图片的读写;模仿opencv的格式写图片自动按后缀进行。
图片显示HObject,HImage单张。同时封装一个一次显示多张图片。

测试: 

#include <iostream>
#include <vector>
#include <assert.h>

#include "imageheader.h"


using namespace std;


int main() {
	const char* girl = "../pictures/girl.jpg";
	const char* gray = "../pictures/gray.jpg";

	HalconClass a;
	a.set_System();

	//显示一个图片
	HObject obj = cv::imread_ha(girl);
	cv::imshow_ha("ddd", obj);

	HImage youlun("patras"), fengjing("plit2");
	cv::imshow_ha("dd1",fengjing);

    //一次显示多个图片
	cv::imshow_ha("dd1", &obj, "dd2", &youlun);
}

函数封装: 读图片

/************************************
图像读写:tcy shanghai 2021/3/17  V1.0
*************************************/
/*
	cv::Mat imread(string,int flag=1);
	void imshow(string winname,Mat mat)
	int  waitKey(int delay=0)
	void namedWindow(string str,int flag=1)
	void destroyWindow(string winname)
	void destroyAllWindows()
	bool imwrite(string filename,img)//成功返回true
	*/

HalconCpp::HObject cv::imread_ha(const std::string & filename, int flag)
{
	HalconCpp::HObject image;

	HalconCpp::ReadImage(&image, filename.c_str());

	if ((flag != -1) && (flag != 4)) {
		HalconCpp::HTuple channels;
		HalconCpp::CountChannels(image, &channels);

		if ((flag == 0) && (channels[0].I() >= 3))
			HalconCpp::Rgb1ToGray(image, &image);
	}

	return image;
}

函数:写图片

void cv::imwrite_ha(const char * filename, const HalconCpp::HObject & image, int fillcolor)
{
	/*
	write_image(Image::Format,FillColor,FileName:)
	*/
	std::string extension = get_file_extension(filename);
	std::string format[] = { "tiff","bmp","jpeg","jp2","png","ima" };

	bool notexists = false;
	for (auto i = 0; i < 6; ++i)
	{
		if (format[i] == extension) { notexists = true; break; }
	}

	if (notexists) throw ("Not exists file format:" + extension);

	HalconCpp::WriteImage(image, extension.c_str(), fillcolor, filename);
}

函数:显示一张图片 

/************************************
图像显示:tcy shanghai 2021/3/17  V1.0
*************************************/
#define __imshow_ha__(winname,image)                  \
{                                                     \
	HTuple width, height;                             \
	                                                  \
	HalconCpp::GetImageSize(image, &width, &height);  \
	HWindow w(0, 0, width, height);                   \
	w.SetWindowParam("window_title", winname.c_str());\
	                                                  \
	image.DispObj(w);                                 \
	w.Click();                                        \
	w.ClearWindow();                                  \
}

void cv::imshow_ha(std::string winname, const HalconCpp::HObject& image) {
	__imshow_ha__(winname, image);
}
void cv::imshow_ha(std::string winname, const HalconCpp::HImage& image) {
	__imshow_ha__(winname, image);
}

函数:一次显示多个图片 

void cv::imshow_ha(std::string name1,HalconCpp::HObject*img1,
	std::string name2,HalconCpp::HObject*img2,
	std::string name3,HalconCpp::HObject*img3,
	std::string name4,HalconCpp::HObject*img4,
	std::string name5,HalconCpp::HObject*img5,
	std::string name6,HalconCpp::HObject*img6,
	std::string name7,HalconCpp::HObject*img7,
	std::string name8,HalconCpp::HObject*img8)
{

	HObject  ho_Image, ho_Image1;
	HTuple id1, id2, id3, id4, id5, id6, id7, id8,w,h;
	
	std::vector<HalconCpp::HObject*> imgs{img1,img2,img3,img4,img5,img6,img7,img8};
	std::vector<std::string> names{name1,name2,name3,name4,name5,name6,name7,name8};
	std::vector<HalconCpp::HTuple> ids{ id1, id2, id3, id4, id5, id6, id7, id8 };
	
	if (HDevWindowStack::IsOpen())
		CloseWindow(HDevWindowStack::Pop());

	for (auto i = 0; i < 8; ++i)
	{
		if (imgs[i] != NULL) {
			SetWindowAttr("window_title", names[i].c_str());
			GetImageSize(*imgs[i], &w, &h);

			OpenWindow(0, 0, w, h, 0, "visible", "", &ids[i]);
			HDevWindowStack::Push(ids[i]);
		}
	}
	for (auto i = 0; i < 8; ++i)
	{
		if (imgs[i] != NULL) {
			HDevWindowStack::SetActive(ids[i]);

			if (HDevWindowStack::IsOpen())
				DispObj(*imgs[i], HDevWindowStack::GetActive());
		}
	}
	
	system("Pause");
}

 

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐