動的に解像度を変化させたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
えく

動的に解像度を変化させたい

#1

投稿記事 by えく » 7年前

はじめまして。
ちょっと詰まっているところがありますので皆さんのお知恵をお貸しいただければなと思い投稿させていただきます。

いま、自分が作りたいコードが
ガウシアンフィルタをもちいて徐々に画像のぼかしを強くしたいというものです。

c++でopencvを導入してやっています。

コード:

#include "stdafx.h"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <chrono>
#include <Windows.h>
#include <conio.h>

using namespace cv;
using namespace std;



int _tmain(int argc, _TCHAR* argv[])
{
	int milliseconds = 0;
	int seconds = 0;
	int minutes = 0;
	int hours = 0;
	double sgm = 0;
	double change_seconds = 15.00;
	double bokashi = 3.00;
	double change = bokashi / change_seconds;
	

	for (;;) {
		if (change_seconds == seconds) {
			if (milliseconds == 10) {
				++seconds;
				milliseconds = 0;
			}
			if (seconds == 60) {
				++minutes;
				seconds = 0;
			}
			if (seconds != 0) {
				if (milliseconds == 0) {
					sgm = sgm + change;
				}
			}
			++milliseconds;
			Sleep(100);
		}
		cout << endl;
	}

	//原画像
	Mat src_image = imread("lena.jpg");
	if (src_image.empty()) return -1;
	Mat dst_image = src_image.clone();


	GaussianBlur(src_image, dst_image, Size(sgm, sgm), 0);

	namedWindow("image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
	imshow("image", dst_image);
	
	waitKey(0);
	destroyAllWindows();
    return 0;
}
このようなコードになっているのですが、ビルドはできるのですが、画像が表示されません。
一応、変化させたい数値を確認したところ一秒あたり0.2ずつ変化するようになっていたので、それを関数にあてはめたらできるかと思ってこう書いています。
GaussianBlurにdouble型の数値を入れても動いたので行けると思いました。
動的に動かすのにimshowはあってないのかなと自分は思ったのですが、imshowでも動かす方法はあるのでしょうか?
研究の一環でやろうとしていることでプログラム作成で大きく時間を割きたくなくて質問してみました。
期限は特にないのですが、来週の火曜日までには何とか形にしたいと考えています。
よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 動的に解像度を変化させたい

#2

投稿記事 by みけCAT » 7年前

えく さんが書きました:このようなコードになっているのですが、ビルドはできるのですが、画像が表示されません。
無限ループで画像を読みこんだり表示したりする部分に行かないようにしているので、当たり前ですね。
リークするかはわかりませんが、とりあえず画像の読み込みとcloneをループの前、GaussianBlurと表示をループの中に入れてみたらどうですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

えく

Re: 動的に解像度を変化させたい

#3

投稿記事 by えく » 7年前

返答ありがとうございます!!!
コードを変更してみたしてみたところ

0x00007FFF60581F28 で例外がスローされました (OpenCVApplication1.exe 内): Microsoft C++ の例外: cv::Exception (メモリの場所 0x0000004B8B9AE290)。
ハンドルされない例外が 0x00007FFF60581F28 で発生しました (OpenCVApplication1.exe 内): Microsoft C++ の例外: cv::Exception (メモリの場所 0x0000004B8B9AE290)。

0x00007FFF0C3092FF (opencv_world310d.dll) で例外がスローされました (OpenCVApplication1.exe 内): 0xC0000005: 場所 0x0000000000000000 の読み取り中にアクセス違反が発生しました


このような表示がでました。

以下コード
[code.Cpp]
#include "stdafx.h"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <chrono>
#include <Windows.h>
#include <conio.h>

using namespace cv;
using namespace std;



int _tmain()
{
int milliseconds = 0;
int seconds = 0;
int minutes = 0;
int hours = 0;
double sgm = 0;
double change_seconds = 15.00;
double bokashi = 3.00;
double change = bokashi / change_seconds;

//原画像
Mat src_image = imread("lena.jpg");
if (src_image.empty()) return -1;
Mat dst_image = src_image.clone();

Rect roi_rect(200, 200, 100, 100);
Mat src_roi = src_image(roi_rect);
Mat dst_roi = dst_image(roi_rect);


for (int i = 0;i<100;i++) {
if (change_seconds == seconds) {
if (milliseconds == 10) {
++seconds;
milliseconds = 0;
}
if (seconds == 60) {
++minutes;
seconds = 0;
}
if (seconds != 0) {
if (milliseconds == 0) {
//sgm = sgm + change;
}
}
++milliseconds;
Sleep(100);
}
GaussianBlur(src_image, dst_image, Size(sgm, sgm), 0);

namedWindow("image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
imshow("image", dst_image);
cout << endl;
}




waitKey(0);
destroyAllWindows();
return 0;
}
[/code]

アバター
ookami
記事: 214
登録日時: 13年前
住所: 東京都

Re: 動的に解像度を変化させたい

#4

投稿記事 by ookami » 7年前

ステップ実行して、何行目で例外が発生しているか確認するのが良いと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る