1)安装好halcon,确保halcon的c++的调用是正常的
2)编译好opencv
上面的两个步骤,均可以参考我的两个博文完成:
Halcon在linux及ARM上的安装及c++工程化_halcon linux-CSDN博客
RK3588上编译opencv 及基于c++实现图像的读入-CSDN博客
// 将halcon图像转换为opencv的图像
Mat HImageToMat(HObject &imgHalcon)
{
HTuple channels;
HString cType;
cv::Mat Image;
ConvertImageType(imgHalcon, &imgHalcon, "byte");
CountChannels(imgHalcon, &channels);
Hlong width = 0;
Hlong height = 0;
if (channels[0].I() == 1)
{
HImage hImg(imgHalcon);
void *ptr = hImg.GetImagePointer1(&cType, &width, &height);//GetImagePointer1(Hobj, &ptr, &cType, &wid, &hgt);
int W = width;
int H = height;
Image.create(H, W, CV_8UC1);
unsigned char *pdata = static_cast(ptr);
memcpy(Image.data, pdata, W*H);
}
else if (channels[0].I() == 3)
{
void *Rptr;
void *Gptr;
void *Bptr;
HImage hImg(imgHalcon);
hImg.GetImagePointer3(&Rptr, &Gptr, &Bptr, &cType, &width, &height);
int W = width;
int H = height;
Image.create(H, W, CV_8UC3);
vector VecM(3);
VecM[0].create(H, W, CV_8UC1);
VecM[1].create(H, W, CV_8UC1);
VecM[2].create(H, W, CV_8UC1);
unsigned char *R = (unsigned char *)Rptr;
unsigned char *G = (unsigned char *)Gptr;
unsigned char *B = (unsigned char *)Bptr;
memcpy(VecM[2].data, R, W*H);
memcpy(VecM[1].data, G, W*H);
memcpy(VecM[0].data, B, W*H);
cv::merge(VecM, Image);
}
return Image;
}
//OpenCV Mat -> Halcon HObject
HObject MatToHImage(Mat &imgMat)
{
HObject Hobj = HObject();
int height = imgMat.rows;
int width = imgMat.cols;
int i;
// CV_8UC3
if (imgMat.type() == CV_8UC3)
{
vector imgchannel;
split(imgMat, imgchannel);
cv::Mat imgB = imgchannel[0];
cv::Mat imgG = imgchannel[1];
cv::Mat imgR = imgchannel[2];
uchar* dataR = new uchar[height * width];
uchar* dataG = new uchar[height * width];
uchar* dataB = new uchar[height * width];
for (i = 0; i
HalconDemo.cpp
#include
#include
#include
using namespace HalconCpp;
using namespace std;
using namespace cv;
// 将halcon图像转换为opencv的图像
Mat HImageToMat(HObject &imgHalcon)
{
HTuple channels;
HString cType;
cv::Mat Image;
ConvertImageType(imgHalcon, &imgHalcon, "byte");
CountChannels(imgHalcon, &channels);
Hlong width = 0;
Hlong height = 0;
if (channels[0].I() == 1)
{
HImage hImg(imgHalcon);
void *ptr = hImg.GetImagePointer1(&cType, &width, &height);//GetImagePointer1(Hobj, &ptr, &cType, &wid, &hgt);
int W = width;
int H = height;
Image.create(H, W, CV_8UC1);
unsigned char *pdata = static_cast(ptr);
memcpy(Image.data, pdata, W*H);
}
else if (channels[0].I() == 3)
{
void *Rptr;
void *Gptr;
void *Bptr;
HImage hImg(imgHalcon);
hImg.GetImagePointer3(&Rptr, &Gptr, &Bptr, &cType, &width, &height);
int W = width;
int H = height;
Image.create(H, W, CV_8UC3);
vector VecM(3);
VecM[0].create(H, W, CV_8UC1);
VecM[1].create(H, W, CV_8UC1);
VecM[2].create(H, W, CV_8UC1);
unsigned char *R = (unsigned char *)Rptr;
unsigned char *G = (unsigned char *)Gptr;
unsigned char *B = (unsigned char *)Bptr;
memcpy(VecM[2].data, R, W*H);
memcpy(VecM[1].data, G, W*H);
memcpy(VecM[0].data, B, W*H);
cv::merge(VecM, Image);
}
return Image;
}
//OpenCV Mat -> Halcon HObject
HObject MatToHImage(Mat &imgMat)
{
HObject Hobj = HObject();
int height = imgMat.rows;
int width = imgMat.cols;
int i;
// CV_8UC3
if (imgMat.type() == CV_8UC3)
{
vector imgchannel;
split(imgMat, imgchannel);
cv::Mat imgB = imgchannel[0];
cv::Mat imgG = imgchannel[1];
cv::Mat imgR = imgchannel[2];
uchar* dataR = new uchar[height * width];
uchar* dataG = new uchar[height * width];
uchar* dataB = new uchar[height * width];
for (i = 0; i0)))
{
std::cout << "find shape is ok " << endl;
VectorAngleToRigid(HTuple(hv_Row[0]), HTuple(hv_Column[0]), hv_Angle, HTuple(hv_RowModel[0]),
HTuple(hv_ColumnModel[0]), 0, &hv_HomMat2DImage);
AffineTransImage(ho_rImage, &ho_ImageAffineTrans, hv_HomMat2DImage, "constant", "false");
CreateDataCode2dModel("QR Code", HTuple(), HTuple(), &hv_DataCodeHandle);
FindDataCode2d(ho_ImageAffineTrans, &ho_SymbolXLDs, hv_DataCodeHandle, HTuple(),
HTuple(), &hv_ResultHandles, &hv_DecodedDataStrings);
std::cout << "QR Code" << ":" << hv_DecodedDataStrings.S() << endl;
image=HImageToMat(ho_ImageAffineTrans);
}
return image;
}
int main()
{
Mat image;
Mat image_opencv = imread("../9.bmp");
if (image_opencv.empty()) {
std::cerr << "Error opening image!" << std::endl;
return -1;
}
image=shape_find(image_opencv);
cout<<"hello";
std::string outputPath = "result.bmp";
imwrite(outputPath,image);
return 0;
}
cmake_minimum_required(VERSION 3.0.0)
project(HalconDemo VERSION 0.1.0)
set(TARGET_NAME HalconDemo)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_EXTENSIONS OFF)
set(OpenCV_DIR "/usr/local/opencv470") # 根据实际安装路径修改
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
# 添加头文件搜索路径
include_directories(include)
link_directories(/opt/halcon/lib/aarch64-linux)
aux_source_directory(. SRCS )
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -fPIC -Wl,--copy-dt-needed-entries -Wno-error=deprecated-declarations -Wno-deprecated-declarations ")
# 寻找./src下面所有.cpp为后缀的源文件,并且保存到SRC变量里面
file(GLOB_RECURSE SRC ./src/*.cpp)
# 编译SRC变量存储的源文件,编译生成目标文件命名为hello
add_executable(hello ${SRC})
#add_library(hello SHARED src/HalconDemo.cpp)
target_link_libraries(hello halcon halconcpp hdevenginecpp)
target_link_libraries(hello ${OpenCV_LIBS})
mkdir build
cd build
cmake ..
make
./hello