【发布时间】:2020-05-21 14:35:21
【问题描述】:
我正在尝试从存储为 blob 的 MySQL 数据库中获取图像并将它们转换为 Mat 对象以进行图像处理。我有一个模板图像,想知道该图像是否是 db 图像的一部分或不使用 matchTemplate() 函数。这是我的代码:
String sql="select * from image_data where image_id="+1
try
{
query obj_query=new query(obj_connect);
ResultSet rs = obj_query.runSimpleQuery(sql);
while (rs.next())
{
Blob image_blob=rs.getBlob("original_image");
Mat img=Imgcodecs.imread(image_blob.toString());
}
}
catch (Exception e)
{
e.printStackTrace();
}
Mat templ=Imgcodecs.imread("templ.png");
在findTemplate 函数中传递这些图像:
MatchTemplate.findTemplete(img, templ, "ress.png", Imgproc.TM_SQDIFF);
这是我的findTemplate 函数:
public static void findTemplete(Mat img, Mat templ, int match_method)
{
double minVal;
int result_cols = img.cols() - templ.cols() + 1;
int result_rows = img.rows() - templ.rows() + 1;
Mat result = new Mat(result_rows, result_cols, CvType.CV_32FC1);
Imgproc.matchTemplate(img, templ, result, match_method);
MinMaxLocResult mmr = Core.minMaxLoc(result);
minVal = mmr.minVal;
if(minVal<=0.75){
//do what you want
}
else
{
//do what you want
}
}
当我运行它时,它给了我一个错误:
OpenCV Error: Assertion failed (s >= 0) in cv::setSize, file C:\builds\master_PackSlaveAddon-win32-vc12-static\opencv\modules\core\src\matrix.cpp, line 306
Exception in thread "main" CvException [org.opencv.core.CvException: cv::Exception: C:\builds\master_PackSlaveAddon-win32-vc12-static\opencv\modules\core\src\matrix.cpp:306: error: (-215) s >= 0 in function cv::setSize
]
at org.opencv.core.Mat.n_Mat(Native Method)
at org.opencv.core.Mat.<init>(Mat.java:37)
它给我错误的行是:
Mat result = new Mat(result_rows, result_cols, CvType.CV_32FC1);
如何处理 Blob 图像以将其传递给 Imagecodecs.imread() 函数?还是有另一种技术可以将Blob 转换为Mat?
【问题讨论】:
-
您应该使用
imdecode而不是imread。也看看here -
您提供的 @Miki 链接采用 C++ 代码。我正在使用java和mysql。你能给我一个java例子吗?